1. 概述

本文介绍如何使用 curl 快速测试 REST 接口。

curl 是一个强大的命令行数据传输工具,支持包括 HTTP 在内的 20+ 种协议,这使得它成为测试 REST 服务的“瑞士军刀”——轻量、通用、无需额外安装客户端。

尤其在调试阶段,直接用 curl 发请求,比写代码或配 UI 工具更简单粗暴,堪称后端开发日常踩坑必备技能。


2. 常用命令行选项

curl 支持超过 200 个命令行参数。虽然我们不需要全掌握,但有几个关键选项能极大提升调试效率。

2.1. 开启详细输出(-v)

测试时建议始终加上 -v(verbose),它会打印请求/响应的完整过程:

curl -v http://www.example.com/

输出示例:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8082 (#0)
> GET /spring-rest/foos/9 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.60.0
> Accept: */*
>
< HTTP/1.1 200
< X-Application-Context: application:8082
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 15 Jul 2018 11:55:26 GMT
<
{
  "id" : 9,
  "name" : "TuwJ"
}
* Connection #0 to host localhost left intact

⚠️ 注意:> 开头的是请求头,< 开头的是响应头,非常直观。


2.2. 保存响应内容(-o)

默认情况下,curl 将响应体输出到终端。如果返回数据较大,建议用 -o 保存到文件:

curl -o out.json http://localhost:8082/spring-rest/foos/1

✅ 这样可以避免终端刷屏,也方便后续用 jq 或编辑器查看。


3. 使用 curl 发送不同 HTTP 方法

RESTful 接口依赖不同的 HTTP 方法,curl 原生支持。

3.1. GET 请求

GET 是 curl 默认方法,无需额外参数:

curl -v http://localhost:8082/spring-rest/foos/9

上面命令会发送一个 GET 请求,获取 ID 为 9 的 Foo 资源。加上 -v 后可看到完整交互过程(见上节示例)。


3.2. POST 请求

POST 用于创建资源,通常需要携带请求体。

方式一:直接传数据(适合小数据)

curl -d 'id=9&name=baeldung' http://localhost:8082/spring-rest/foos/new

⚠️ 但这样默认 Content-Type 是 application/x-www-form-urlencoded,很多现代 API(尤其是 Spring Boot)只接受 JSON,会返回 415 错误:

{
  "timestamp": "15-07-2018 05:57",
  "status": 415,
  "error": "Unsupported Media Type",
  "exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
  "path": "/spring-rest/foos/new"
}

✅ 正确姿势:显式指定 JSON 类型:

curl -d '{"id":9,"name":"baeldung"}' -H 'Content-Type: application/json' \
  http://localhost:8082/spring-rest/foos/new

方式二:从文件读取请求体(推荐用于复杂结构)

curl -d @request.json -H "Content-Type: application/json" \
  http://localhost:8082/spring-rest/foos/new

其中 request.json 内容如下:

{
  "id": 9,
  "name": "baeldung"
}

Windows 用户注意

Windows 命令行不支持单引号,需改用双引号并转义:

curl -d "{\"id\":9,\"name\":\"baeldung\"}" -H "Content-Type: application/json" \
  http://localhost:8082/spring-rest/foos/new

3.3. PUT 请求

PUT 用于更新已有资源,语法与 POST 类似,但必须显式指定 -X PUT

curl -d @request.json -H 'Content-Type: application/json' \
  -X PUT http://localhost:8082/spring-rest/foos/9

⚠️ 不指定 -X 时,curl 默认使用 GET,这是个常见踩坑点。


3.4. DELETE 请求

DELETE 用于删除资源,通常无请求体:

curl -X DELETE http://localhost:8082/spring-rest/foos/9

如果接口要求带 body 或 header,也可以加 -d-H


4. 自定义请求头

通过 -H 参数可以添加或覆盖默认请求头。

修改 Host 头(用于测试虚拟主机)

curl -H "Host: com.baeldung" http://example.com/

禁用 User-Agent

curl -H "User-Agent:" http://example.com/

设置 Accept 和 Content-Type(最常见场景)

curl -d @request.json -H "Content-Type: application/json" \
  -H "Accept: application/json" http://localhost:8082/spring-rest/foos/new

✅ 实际项目中,尤其是对接第三方 API,这类 header 控制非常关键。


5. 接口认证处理

很多接口需要身份验证,curl 提供了多种方式。

5.1. Basic Auth

最简单的用户名密码认证:

curl --user baeldung:secretPassword http://api.example.com/secure-data

等价于在 header 中添加:

Authorization: Basic base64(username:password)

5.2. Bearer Token(OAuth2)

更常见的场景是使用 Bearer Token,比如从 OAuth2 授权服务获取 access_token

{
  "access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3",
  "token_type": "bearer",
  "refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91",
  "expires_in": 31234
}

拿到 token 后,在请求中带上 Authorization 头:

curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" \
  http://api.example.com/user/profile

✅ 这种方式广泛用于现代微服务架构,Spring Security、JWT 等都基于此模式。


6. 总结

本文覆盖了使用 curl 测试 REST 接口的核心技巧:

  • -v 查看完整请求流程
  • -d 发送请求体,注意 JSON 类型设置
  • -X 指定非 GET 方法
  • -H 自定义 header,特别是 Content-Type 和 Authorization
  • ✅ 支持 Basic Auth 和 Bearer Token 认证

虽然 curl 功能远不止这些(比如代理、cookie、上传文件等),但对于日常开发中的接口调试,掌握以上内容已完全够用。

📌 建议集合本文,下次遇到接口问题,别急着写代码或开 Postman,先来一行 curl -v 看看发生了什么。


原始标题:Test a REST API with curl | Baeldung