用curl测试REST API
1. 概述
本教程简要概述了使用curl 测试 REST API。
**curl是一个用于传输数据的命令行工具,它支持大约 22 种协议,包括 HTTP。**这种组合使它成为测试我们的 REST 服务的非常好的临时工具。
2.命令行选项
curl支持超过 200 个命令行选项。我们可以让它们中的零个或多个伴随命令中的 URL。
在我们将它用于我们的目的之前,让我们看一下两个可以让我们的生活更轻松的东西。
2.1.详细
当我们进行测试时,最好将详细模式设置为:
curl -v http://www.example.com/
因此,这些命令提供了有用的信息,例如解析的 IP 地址、我们尝试连接的端口和标头。
2.2. 输出
默认情况下,curl将响应正文输出到标准输出。此外,我们可以提供输出选项以保存到文件:
curl -o out.json http://www.example.com/index.html
当响应大小很大时,这尤其有用。
3. 使用*curl *的HTTP 方法
每个 HTTP 请求都包含一个方法。最常用的方法是 GET、POST、PUT 和 DELETE。
3.1. GET
这是使用curl进行 HTTP 调用时的默认方法。事实上,前面展示的示例是简单的 GET 调用。
在端口 8082 上运行服务的本地实例时,我们会使用类似以下命令的命令来进行 GET 调用:
curl -v http://localhost:8082/spring-rest/foos/9
由于我们开启了详细模式,我们会获得更多信息以及响应正文:
* 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
3.2. POST
我们使用这种方法将数据发送到接收服务,这意味着我们使用 data 选项。
最简单的方法是在命令中嵌入数据:
curl -d 'id=9&name=blogdemo' http://localhost:8082/spring-rest/foos/new
或者,我们可以将包含请求正文的文件传递给 data 选项,如下所示:
curl -d @request.json -H "Content-Type: application/json"
http://localhost:8082/spring-rest/foos/new
通过按原样使用上述命令,我们可能会遇到如下错误消息:
{
"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"
}
这是因为curl将以下默认标头添加到所有 POST 请求中:
Content-Type: application/x-www-form-urlencoded
这也是浏览器在普通 POST 中使用的内容。在我们的使用中,我们通常希望根据需要自定义标题。
例如,如果我们的服务需要 JSON 内容类型,那么我们可以使用 -H 选项来修改我们原来的 POST 请求:
curl -d '{"id":9,"name":"blogdemo"}' -H 'Content-Type: application/json'
http://localhost:8082/spring-rest/foos/new
Windows 命令提示符不支持单引号,例如类 Unix shell。
因此,我们需要用双引号替换单引号,尽管我们会在必要时尝试对它们进行转义:
curl -d "{\"id\":9,\"name\":\"blogdemo\"}" -H "Content-Type: application/json"
http://localhost:8082/spring-rest/foos/new
此外,当我们要发送较大量的数据时,使用数据文件通常是一个好主意。
3.3. PUT
此方法与 POST 非常相似,但我们在想要发送现有资源的新版本时使用它。为此,我们使用 -X 选项。
没有提及请求方法类型,curl默认使用 GET;因此,我们在 PUT 的情况下明确提及方法类型:
curl -d @request.json -H 'Content-Type: application/json'
-X PUT http://localhost:8082/spring-rest/foos/9
3.4. DELETE
同样,我们通过使用 -X 选项指定我们要使用 DELETE:
curl -X DELETE http://localhost:8082/spring-rest/foos/9
4. 自定义标题
我们可以替换默认标题或添加我们自己的标题。
例如,要更改 Host 标头,我们这样做:
curl -H "Host: com.blogdemo" http://example.com/
要关闭 User-Agent 标头,我们输入一个空值:
curl -H "User-Agent:" http://example.com/
测试时最常见的场景是更改 Content-Type 和 Accept 标头。我们只需要在每个标题前面加上 -H 选项:
curl -d @request.json -H "Content-Type: application/json"
-H "Accept: application/json" http://localhost:8082/spring-rest/foos/new
5. 认证
需要身份验证 的服务将发回 401 - 未经授权的 HTTP 响应代码,以及相关的 WWW-Authenticate 标头。
对于基本身份验证,我们可以使用 user 选项简单地将用户名和密码组合嵌入我们的请求中:
curl --user blogdemo:secretPassword http://example.com/
但是,如果我们想使用 OAuth2 进行身份验证 ,我们首先需要从我们的授权服务中获取access_token 。
服务响应将包含access_token:
{
"access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3",
"token_type": "bearer",
"refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91",
"expires_in": 31234
}
现在我们可以在 Authorization 标头中使用令牌:
curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" http://example.com/