使用 Curl 命令的 RESTful API 交互

2023-10-13

主要用途之一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 -Fflag表示表单数据。在这里,您尝试登录并发送用户名和密码。

认证成功后,服务器返回一个认证令牌,该令牌将用于后续需要的请求验证.

 

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通常可以从流行的包管理器安装,例如aptor 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 Linkheader 提供上一页和下一页的 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”的新存储库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Curl 命令的 RESTful API 交互 的相关文章

  • 为什么我的 sed 命令在使用变量时失败?

    使用 bash 我尝试插入日期变量并搜索该日期的日志文件 然后将输出发送到文件 如果我像这样对日期进行硬编码 它会起作用 sed n Nov 22 2010 p file gt log file 但如果我这样做就会失败 date Nov 2
  • Eclipse CDT 内置包含目录

    Under Eclipse CDT gt Project Settings gt C C General gt Paths and Symbols gt Includes gt GNU C 有一个包含路径的列表 有些是粗体的并且是特定于项目
  • 来自外部 .diff 文件的交互式补丁

    Linux 是否有命令或程序允许交互式地修补源代码 在屏幕上打印每个块并在将其应用到文件之前等待确认 就像是git add p 但是从另一个 diff 文件中进行更改 您始终可以在 shell ruby python 中编写脚本 逐行读取该
  • mod_fcgid + PHP + apache 锁定

    我正在运行一个相当典型的 LAMP 堆栈 其中 PHP 通过 mod fcgid 运行 考虑到服务器收到的流量 我认为服务器处于 高负载 状态 存在一个间歇性问题 当访问依赖 PHP 的站点时 Apache 报告所有连接都处于 正在发送内容
  • 在 Linux 上的 makefile 和 Makefile 之间进行选择

    我想在一个目录中同时使用 Makefile 和 makefile 进行 make 默认情况下 它将执行makefile 我可以选择执行 Makefile 吗 提前致谢 最简单的选择是使用 f make f Makefile From man
  • 如何从 ext2/ext3 文件系统上的稀疏文件中删除一些块

    当您写入稀疏文件时 ext2 ext3 文件系统会自动分配块 但是当我不再需要其中的某些块时 我发现没有办法做到这一点 感觉就像使用 malloc 而不使用 free 是否可以 释放 稀疏文件的某些块 如果是的话 怎么样 不要告诉我将其复制
  • 文件在 rpm 规范文件中列出两次

    我的规范文件的文件部分如下所示 files prefix htdocs config prefix htdocs share settings config inc php 现在 由于配置文件已经包含在 prefix htdocs 我收到警
  • 如何使用AWK从文件中连续输出行

    我有一个多行文件 我想连续输出文件的某些行 比如第一次 从第1行打印到第5行 下次 打印第2行到第6行 依此类推 我发现 AWK 是一个非常有用的函数 我尝试自己编写代码 但它什么也没输出 以下是我的代码 bin bash for n in
  • 让子进程等待直到收到父进程的信号

    我想从父级创建 N 个子级 我希望所有的孩子同时开始 一个功能 测量时间 因此 我将该函数放入信号处理程序中 当父级完成创建 分叉 所有子级时 它会向所有子级发送信号 使用kill children id 以让 make 开始 代码如下 但
  • VS Code 不会构建具有多个 .cpp 源文件的 C++ 程序

    请注意 我在 Ubuntu 17 10 上使用 VS Code 并使用 GCC 编译器 我在构建一个使用附加 cpp 文件的简单程序时遇到问题 我可能在这里遗漏了一些明显的东西 因为我对编程相当陌生 但我会解释到目前为止我所做的事情 这阻止
  • 如何在 C++ 中检查文件是否已被另一个应用程序打开?

    我知道 有is open C 中的函数 但我希望一个程序检查文件是否尚未被另一个应用程序打开 有没有办法使用标准库来做到这一点 编辑 在答案中澄清这是针对 Linux 应用程序的 不仅标准库没有这个功能 一般来说也是不可能的 你可以 在li
  • 在 Alpine Docker 容器上安装 OpenSSH

    第一次运行 alpine docker 容器并尝试 openssh 安装时 会发生以下情况 ole T docker run it rm alpine bin ash apk add openssh WARNING Ignoring APK
  • 如何在 Amazon Linux 上安装最新版本的 GDAL?

    我想安装GDAL https gdal org 在运行 Amazon Linux 的 EC2 实例上 我认为它基于 RHEL 6 如果可能的话 我想避免从源代码编译 EPEL Yum 存储库中包含的 GDAL 版本对于我的目的来说太旧了 g
  • 为什么当设置为 TLS 选择器时,ES 和 DS 在 64 位内核上最终会归零?

    下面的 32 位程序调用set thread area 2 http linux die net man 2 set thread area在 GDT 中创建一个条目 该条目旨在用于 TLS 通常将结果选择器放入FS or GS并成功使用
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 如何在 Python 中将列表变量传递给 subprocess.call 命令

    我有一个清单 apps apps append wq35a5huqlja45jsyukrpmwuiayovrmh apps append q7mimvgduueernwvw4y22t5huemykntw apps append pmudbp
  • Plink 通过 C# 返回不需要的字符

    通过 C 使用 Plink 时 我在结果前后收到不需要的字符 Command ls l informatica tgtdynamicparams out grep vaulttest grep Sep 1 awk print 9 sort
  • DHCP 服务器将任何 url 重定向到登陆页面

    我有一个 Linux DHCP 服务器 我需要将所有网络流量重定向到一个登陆页面 该页面将包含有关如何在网络上注册计算机的说明 无论用户输入什么 URL 都需要将用户重定向到网页 在 DHCP 服务器上 即 用户输入 google com
  • Python:文本覆盖在所有窗口顶部,包括 Linux 中的全屏

    我正在尝试用 python 编写一个简单的脚本 在所有窗口和全屏应用程序之上输出文本 该脚本的目的是以类似于 Steam FPS 计数器工作方式的方式输出平均负载和可用内存 以及其他有用的统计数据 到目前为止 我尝试了 pygame 但据我
  • Ansible 权限问题

    我正在尝试将当前用户添加到系统中的某个组 然后执行需要该组权限的命令 我的剧本是这样的 name Add this user to RVM group sudo true user state present name vagrant ap

随机推荐

  • 列表:可变和动态

    在本课程中 您将探索 Python 列表如何可变和动态 Python 中的许多类型是不可变的 整数 浮点数 字符串 并且 正如您将在本课程后面学到的 元组都是不可变的 一旦创建了这些对象之一 就无法对其进行修改 除非您将该对象重新分配给新值
  • 在屏幕上绘图

    在本课程中 您将开始使用Surface 回想一下 一个表面是一个可以在其上绘图的矩形对象 就像一张白纸 这screen对象是一个Surface 并且您可以创建自己的Surface与显示屏分离的物体 您将用白色填充屏幕 并添加一个新的Surf
  • 数据科学数学

    数据科学数学 学习路径 技能 统计 相关性 线性回归 逻辑回归 在这个学习路径中 您将获得在数据科学方面取得进步所需的数学基础 其他资源 真正的 Python 数据科学主题 真正的 Python 机器学习主题 数据科学数学 学习路径 5 种
  • Python 基础练习:文件系统操作(概述)

    In Python 基础知识 文件系统操作 您学习了如何使用 Python 处理文件和文件夹 作为一名程序员 您将使用pathlib和shutil要完成的模块文件系统操作不依赖你的图形用户界面 GUI 虽然您已经进行了大量文件系统操作的实践
  • 使用 Python 和 ggplot 绘制数据图表

    在本课程中 您将学习如何使用ggplot在Python中使用创建数据可视化图形语法 图形语法是一种高级工具 可让您以高效且一致的方式创建数据图 它抽象了最底层的细节 让您专注于为数据创建有意义且美观的可视化效果 有几个 Python 包提供
  • MicroPython 入门(概述)

    您对物联网 家庭自动化和互联设备感兴趣吗 你有没有想过建造一把爆能枪 一把激光剑 甚至你自己的机器人会是什么样子 如果是这样 那么您很幸运 微Python可以帮助您完成所有这些事情以及更多 在本课程中 您将了解 这历史微Python的 这差
  • Jupyter 终端及更多

    Jupyter Notebooks 不仅可以让您启动笔记本 在本课程中 您将学习如何启动新终端以及如何在浏览器中创建文件夹或文件
  • 2021 年 8 月 11 日

    主持人大卫 阿莫斯回答会员的问题 本周 Real Python 社区经理 Andres Pineda 也加入了 David 的行列 在这次会议上 我们讨论了 Python 新闻和更新 如何开始使用 Python 进行日志记录 如何学习编写更
  • 适合 Python 程序员的 C

    目录 The C Preprocessor 包括 定义 undef if pragma 错误 Basic C Syntax for Python Programmers 一般的 if 语句 switch 语句 循环 功能 指针 弦乐 结构体
  • 关于约翰·斯特茨

    关于约翰 斯特茨 John 是一位狂热的 Python 爱好者 也是 Real Python 教程团队的成员 约翰的教程 Python 中的模字符串格式化 Python 中的递归 简介 Python 中的函数式编程 何时以及如何使用它 Py
  • pandas 排序方法入门

    有关这些视频中使用的 REPL 的更多信息 您可以查看蟒蛇以及真正的 Python 教程探索 bpython 具有类似 IDE 功能的 Python REPL
  • 漂亮的印花

    此外print Python 包括一个漂亮的印刷品方法 此方法对于以更易于阅读的格式输出有关对象的调试信息特别有用 gt gt gt gt gt gt from pprint import pprint gt gt gt data squa
  • Python 新闻:2021 年 12 月以来的新增内容

    目录 Python 指导委员会选举 Python 新版本 Python 3 6 生命周期结束 代码的出现 Python 的下一步是什么 In 2021 年 12 月 第四个Python指导委员会像往常一样 由新成员和回归成员组成 Pytho
  • 第 12 集:Python 中的网页抓取:工具、技术和合法性

    第 12 集 Python 中的网页抓取 工具 技术和合法性 真正的 Python 播客 2020年6月5日50公尺 RSS Apple Podcasts Google Podcasts Spotify More 播客瘾君子 灰蒙蒙 袖珍铸
  • 列表:有序和任意

    您已经了解了如何创建列表 在本课程中 您将了解到列表是有序的并且可以包含任意对象的集合 定义列表时使用的顺序在列表的生命周期内保持不变 包含相同元素但顺序不同的列表是不同的 gt gt gt gt gt gt a spam egg baco
  • 在“for”循环中使用 .append() 进行附加处理

    有关本课程所涵盖概念的更多信息 您可以查看 Python enumerate 简化需要计数器的循环 真正的Python文章 Python for 循环 确定迭代 真正的Python文章
  • 设计和指导:Python 中的 OOP(概述)

    编写优秀的面向对象代码不仅仅是如何编写 句法 知道何时和何时不使用它 以及指导原则 在后面面向对象设计将帮助您编写更好的代码 在本课程中 您将了解 中的面向对象方法Python 与其他语言 您的情况不应该使用Python 中的类 继承的替代
  • 使用 Sed 命令在 Linux 中追加文本

    Sed提供根据特定模式或条件将文本附加到文件中的行的能力 您可以使用a 命令输入sed在模式匹配后添加新行 让我们深入研究现实世界的示例 以了解如何有效地利用此功能 目录 hide 1 在匹配的模式后添加一行 2 在匹配的模式后追加多行 3
  • Linux Web 服务器 (Apache) 的安装、配置和故障排除

    在本教程中 我们将具体讨论 Linux Web 服务器或 Apache Web 服务器 以及如何安装和配置它以向其他人提供您的内容 Web 服务器是一个通过 HTTP 协议处理请求的系统 您向服务器请求一个文件 它会响应所请求的文件 这可能
  • 使用 Curl 命令的 RESTful API 交互

    主要用途之一curl与 RESTful API 进行交互 RESTful API 是许多现代 Web 应用程序和服务的支柱 在本教程中 您将学习如何使用 RESTful API 进行交互卷曲命令 获取数据 发布信息以及解析各种响应 目录 h