主要用途之一curl
与 RESTful API 进行交互,RESTful API 是许多现代 Web 应用程序和服务的支柱。
在本教程中,您将学习如何使用 RESTful API 进行交互卷曲命令、获取数据、发布信息以及解析各种响应。
获取请求
当您需要从 API 端点获取数据时,GET
请求是您的首选方法。
这是最简单的请求类型,查询 API 来获取信息。
curl https://api.example.com/users/123
Output:
{
"id": 123,
"name": "John Doe",
"email": "john@example.com"
}
收到的响应是 JSON 格式的数据,显示 ID 为 123 的用户的详细信息。
该数据可以通过其他工具或脚本进行处理,或者简单地手动查看。
大多数现代 RESTful API 将提供 JSON 格式的响应。
当您想要获取具有特定参数的数据时,可以将它们直接附加到 URL 中。
curl https://api.example.com/users?role=admin
Output:
[
{
"id": 101,
"name": "Alice",
"role": "admin"
},
{
"id": 102,
"name": "Bob",
"role": "admin"
}
]
在此示例中,我们正在查询具有“admin”角色的用户的 API。响应列出了符合此条件的所有用户。
邮寄请求
当涉及到创建新资源或向 API 提交数据时,POST
请求是您的主要方法。
POST
请求允许您将数据发送到服务器,通常会导致创建新记录或资源。
curl -X POST -H "Content-Type: application/json" -d '{"name":"Jane Doe", "email":"jane@example.com"}' https://api.example.com/users
Output:
{
"id": 124,
"name": "Jane Doe",
"email": "jane@example.com",
"status": "created"
}
分解命令:
-
-X POST
指示您发出的请求类型,即POST
.
-
-H "Content-Type: application/json"
设置请求的标头,通知服务器您正在发送 JSON 格式的数据。
-
-d
后面是您要发送的数据负载,用单引号引起来。
服务器的响应确认用户“Jane Doe”已成功创建,为她分配 ID 124 并提供状态“已创建”。
curl -X POST -F "username=jane_doe" -F "password=secret123" https://api.example.com/login
Output:
{
"token": "abcd1234",
"status": "authenticated"
}
该命令演示了使用发送数据的另一种方式POST
,尤其是在处理表单时。
The -F
flag表示表单数据。在这里,您尝试登录并发送用户名和密码。
认证成功后,服务器返回一个认证令牌,该令牌将用于后续需要的请求验证.
PUT 和 PATCH 请求
更新 API 中的现有资源通常涉及使用PUT
or PATCH
要求。虽然两者都用于更新,但它们的用途略有不同:
-
PUT
:通常在您提供资源的完全更新版本时使用。
-
PATCH
:当您仅更新资源的特定部分时使用。
让我们通过实际例子来深入探讨两者。
PUT 命令
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Jane Smith", "email":"jane.smith@example.com"}' https://api.example.com/users/124
Output:
{
"id": 124,
"name": "Jane Smith",
"email": "jane.smith@example.com",
"status": "updated"
}
In this PUT
例子:
-
-X PUT
指定请求的类型。
- 您再次将内容类型设置为 JSON。
- 您发送的数据旨在用 ID 124 的现有数据完全替换用户。
- 该响应确认用户详细信息已更新。
补丁命令
curl -X PATCH -H "Content-Type: application/json" -d '{"email":"jane.doe@example.com"}' https://api.example.com/users/124
Output:
{
"id": 124,
"name": "Jane Smith",
"email": "jane.doe@example.com",
"status": "partially updated"
}
In this PATCH
例子:
- 您仅向 ID 为 124 的用户发送新电子邮件地址,其他字段保持不变。
- 服务器通过返回“部分更新”状态来确认部分更新。
删除请求
您可以使用DELETE
当您需要从 API 中删除资源或记录时发出请求。
curl -X DELETE https://api.example.com/users/124
Output:
{
"status": "deleted",
"message": "User with ID 124 has been removed."
}
在这个例子中:
-
-X DELETE
指示您正在发起的请求的类型。
- URL 指向要删除的特定用户资源,由其 ID 标识,在本例中为 124。
服务器的响应确认用户已成功删除。通常,API 会返回状态消息,以明确操作结果。
请注意,并非所有 API 在执行操作时都会返回详细数据DELETE
手术。
获取并解析 JSON
The jq
工具允许您从命令行解析 JSON,它与curl
获取并解析 JSON 数据。
curl https://api.example.com/users/123
Output:
{
"id": 123,
"name": "John Doe",
"email": "john@example.com"
}
现在,假设您只想从此 JSON 响应中提取用户名。
curl -s https://api.example.com/users/123 | jq '.name'
Output:
"John Doe"
这是一个细分:
- The
-s
标志确保curl
在“静音”模式下运行,减少不必要的输出。
-
|
管道的输出curl
命令进入jq
命令。
-
jq '.name'
指示jq
解析 JSON 并提取与“name”键关联的值。
jq
功能极其强大,可以对 JSON 数据执行复杂的查询、过滤和操作。
阅读更多内容使用 Linux jq 命令进行 JSON 操作.
获取和解析 XML
就像使用 JSON 一样,您可以使用以下方式获取 XML 数据curl
然后用合适的工具解析它,例如xmlstarlet
.
To use xmlstarlet
with curl
,确保这两个工具都安装在您的系统上。xmlstarlet
通常可以从流行的包管理器安装,例如apt
or yum
.
curl https://api.example.com/users/123.xml
Output:
<user>
<id>123</id>
<name>John Doe</name>
<email>john@example.com</email>
</user>
如果您想从此 XML 响应中提取用户名。
curl -s https://api.example.com/users/123.xml | xmlstarlet sel -t -v "/user/name"
Output:
John Doe
以下是该命令的详细说明:
- 和以前一样,
-s
旗帜保持curl
处于“静音”模式。
-
|
通过管道传输 XML 输出curl
命令进入xmlstarlet
命令。
- The
sel
命令输入xmlstarlet
代表“select”,用于查询XML数据。
-
-t
指定模板模式。
-
-v "/user/name"
提取与 XML 路径关联的值/user/name
.
使用分页标头和查询参数
大多数 API 使用查询参数,例如page
, limit
, or offset
来控制分页。
curl https://api.example.com/users?page=2&limit=50
Output:
[
// Array of 50 users starting from the 51st user
]
通过增加?page=2&limit=50
对于该 URL,您正在请求第二页用户,每页限制为 50 个用户。
某些 API 在响应标头而不是正文中提供分页详细信息。
curl -I https://api.example.com/users?page=2
Output:
HTTP/1.1 200 OK
Date: Mon, 23 Aug 2023 09:00:00 GMT
Link: <https://api.example.com/users?page=1>; rel="prev", <https://api.example.com/users?page=3>; rel="next"
- The
-I
旗帜告诉curl
仅获取响应的标头。
- The
Link
header 提供上一页和下一页的 URL。通过检查这些链接,您可以浏览分页结果。
同时使用标头和查询参数
您可以结合使用这两种技术:
curl -I -G -d "page=2" -d "limit=50" https://api.example.com/users
Output:
HTTP/1.1 200 OK
Date: Mon, 23 Aug 2023 09:00:00 GMT
Link: <https://api.example.com/users?page=1&limit=50>; rel="prev", <https://api.example.com/users?page=3&limit=50>; rel="next"
- The
-G
旗帜告诉curl
发送指定的数据-d
作为 GET 请求查询字符串。
- 多种的
-d
标志有助于构建完整的查询字符串。
API 端点基准测试
最简单的指标之一是请求所花费的总时间。您可以使用curl
‘s -w
(or --write-out
) 选项来打印此信息。
curl -s -o /dev/null -w "Total time: %{time_total}\n" https://api.example.com/users/1
Output:
Total time: 0.215
命令中发生的情况如下:
-
-s
runs curl
在静音模式下。
-
-o /dev/null
丢弃实际的响应正文,确保只有我们的自定义输出可见。
-
-w "Total time: %{time_total}\n"
打印请求所花费的总时间。
比较端点速度
要比较不同端点的响应能力,您可以在 shell 脚本中使用简单的循环:
endpoints=("users/1" "users/2" "posts/1")
for endpoint in "${endpoints[@]}"; do
curl -s -o /dev/null -w "${endpoint} took %{time_total} seconds\n" https://api.example.com/$endpoint
done
Output:
users/1 took 0.203 seconds
users/2 took 0.187 seconds
posts/1 took 0.220 seconds
该脚本将请求发送到各个端点并打印出每个端点花费的时间,从而直接比较它们的速度。
对于详细的性能分析,您可以使用 Apache Benchmark 等工具(ab
)它提供了比curl
.
使用压缩进行优化
通过使用压缩数据,您可以减少客户端和服务器之间传输的数据量,从而加快响应时间。
curl -H "Accept-Encoding: gzip" -s -o /dev/null -w "Downloaded size: %{size_download}\n" https://api.example.com/large-data
通过发送Accept-Encoding: gzip
标头,您向服务器表明您的客户端可以处理 gzip 压缩的响应。
如果服务器支持压缩,它将以压缩格式发送数据。
现实世界的例子
我们以 GitHub 的 RESTful API 为例。本演练将演示如何:
- 使用 GitHub API 进行身份验证。
- 获取经过身份验证的用户的详细信息。
- 列出经过身份验证的用户的存储库。
- 创建一个新的存储库。
使用 GitHub API 进行身份验证
在调用 GitHub API 之前,您需要一个个人访问令牌,您可以从 GitHub 设置生成该令牌。
TOKEN="YOUR_GITHUB_TOKEN"
Replace YOUR_GITHUB_TOKEN
使用您生成的个人访问令牌。
获取经过身份验证的用户的详细信息
准备好令牌后,获取您自己的用户详细信息。
curl -s -H "Authorization: token $TOKEN" https://api.github.com/user
列出经过身份验证的用户的存储库
检索与您的帐户关联的存储库列表。
curl -s -H "Authorization: token $TOKEN" https://api.github.com/user/repos
创建一个新的存储库
要创建新存储库,请使用POST
带有指定存储库名称和其他属性的 JSON 负载的请求。
curl -s -X POST -H "Authorization: token $TOKEN" -H "Content-Type: application/json" -d '{"name":"my-new-repo"}' https://api.github.com/user/repos
此命令创建一个名为“my-new-repo”的新存储库。