Contents

用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/