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
看看发生了什么。