Python语言调用免费查询ip地址API
如何发起API请求(使用cURL)
阅读并练习本文后,您将了解如何使用 cURL 执行带有 GET 方法的 API 调用。您将知道何时使用 cURL 而不是 Postman 来测试 API。
在阅读和练习本文之前,请确保你已经阅读并练习了我的第 1 部分文章: 如何使用 Postman 发出基本的 API 请求。
什么是 cURL?
cURL 是一个可以在大多数命令行界面 (CLI)(如 Windows 命令提示符、Windows Powershell、MacOS 终端、Linux 终端)上调用 API 的命令。它是 Windows 和 MacOS 上的默认命令,但您可能需要安装其他软件包才能在 Linux 终端上使用。这意味着您可以使用 cURL 作为 Postman 的替代品来测试 API。
为什么使用 cURL 而不是 Postman?
由于以下原因,您可能希望使用 cURL 而不是 Postman:
- cURL 可以在无法访问 Postman 的环境中测试 API 调用。
- 其中一种情况是远程 Linux 实例。您可能在云资源(AWS EC2、GCE VM、Azure VM 等)上有一个 VM,并且您想检查 VM 是否可以成功调用 API。cURL 是测试这一点最方便的工具。
- API 文档通常有使用 cURL 调用 API 的示例代码,但没有 Postman(即 Shopify API )。
- 您可以从文档中复制示例 cURL 代码并立即运行。文档中很少有 Postman 示例。这意味着使用 cURL,您将能够使用提供的示例快速测试 API。
- cURL 可以从您的本地机器测试 API 调用。
- Postman 默认从其云服务器进行 API 调用。
- 您可能会遇到这样的情况:您可以在 Postman 上成功调用 API,但在本地计算机上从脚本调用 API 时会失败。在这种情况下,您可能需要使用其他工具直接从本地计算机进行 API 调用。cURL 是一款出色的工具。
- 请注意,Postman 也可以从您的本地计算机而不是其云服务器进行 API 调用,但您必须先在本地安装 Postman 代理才能执行此操作。
演示:如何使用 cURL 调用 API
本文将使用 Poke API(一种公共 REST API)进行演示。Poke API 用于与公共 Pokemon 数据库进行交互。我使用 Pokemon 资源(什么是资源?请参阅后面的解释)。Poke API 文档在此处: 文档 — PokéAPI
API 文档的结构: 请熟悉如何阅读第 1 部分文章的 3.1 节中的 API 文档。那里提供了有关 PokeAPI 文档的一个例子。
1)API请求工具
要使用 API,我们需要一个工具来发出 API 请求。最流行的工具是:
- Postman:一款主要用于测试 API 请求的 Web 应用/桌面应用。第 1 部分演示了如何使用 Postman
- CURL:一个命令行工具
- 一种编程语言(例如 Python)
我将在本演示中使用 cURL。请打开您的 OS 终端以使用 cURL
- Windows:使用命令提示符 (cmd) 或 Powershell。本文使用 Windows 的 cmd
- MacOS:使用终端
- Linux:使用终端
通过在 OS 终端中输入并按 Enter 来测试 cURL 是否已安装在您的机器上 curl --version
。输出将显示当前安装的 cURL 版本,如下所示(以下是 Linux 上的 cURL)。
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3 Release-Date: 2020-01-08 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
2)检测发出 API 请求所需的输入
要发出 API 请求,您至少需要 3 个输入:
- 端点:数据表的 URL
- 方法:与端点使用的交互方法
- 授权:针对API系统的授权方式。
当您查看 Pokemon 表 时,您将看到有关端点和方法的以下信息:
在图片中,你可以看到方法是 GET 。端点是 https://pokeapi.co/api/v2/pokemon
后一部分 {id or name}
,称为路径参数。路径参数可以是必需的,也可以是可选的。对于 Poke API,它是可选的。你怎么知道的?它在 资源列表/分页部分 中提到。(调用任何没有资源 ID 或名称的 API 端点将…)
我们需要的最后一个输入是授权。像这样的公共 API 意味着任何人都可以在未经授权的情况下使用它。因此授权方法是 No Auth。
总而言之,以下是我们将用来从 Pokemon 表中获取数据的输入:
- 端点: https://pokeapi.co/api/v2/pokemon
- 方法:GET
- 授权:无授权
您可以在第 1 部分文章的术语部分中看到更多类型的授权。
3)将输入导入 cURL
让我们根据上面的输入构建 cURL 命令
- cURL 命令结构:
curl [OPTIONS] [URL]
- 端点进入 [URL] 部分。所以我们有
curl https://pokeapi.co/api/v2/pokemon
- 要指定 API 方法,我们使用选项
-X
(简称 )--request
,并在其后加上 GET。所以我们有curl -X GET https://pokeapi.co/api/v2/pokemon
- 如果授权方法是
No Auth
,则您不必在命令中提供其他信息
所以我们的最终命令是 curl -X GET https://pokeapi.co/api/v2/pokemon
。让我们将其输入到我们的 OS 终端并按 Enter 键查看输出。这是我在 Linux 和 Windows 机器上的成功输出(我对其进行了一些格式化以使其看起来更漂亮)。
{ "count":1281, "next":"https://pokeapi.co/api/v2/pokemon?offset=20&limit=20", "previous":null, "results":[ { "name":"bulbasaur", "url":"https://pokeapi.co/api/v2/pokemon/1/" }, { "name":"ivysaur", "url":"https://pokeapi.co/api/v2/pokemon/2/" }, { "name":"venusaur", "url":"https://pokeapi.co/api/v2/pokemon/3/" }, { "name":"charmander", "url":"https://pokeapi.co/api/v2/pokemon/4/" }, { "name":"charmeleon", "url":"https://pokeapi.co/api/v2/pokemon/5/" }, { "name":"charizard", "url":"https://pokeapi.co/api/v2/pokemon/6/" }, { "name":"squirtle", "url":"https://pokeapi.co/api/v2/pokemon/7/" }, { "name":"wartortle", "url":"https://pokeapi.co/api/v2/pokemon/8/" }, { "name":"blastoise", "url":"https://pokeapi.co/api/v2/pokemon/9/" }, { "name":"caterpie", "url":"https://pokeapi.co/api/v2/pokemon/10/" }, { "name":"metapod", "url":"https://pokeapi.co/api/v2/pokemon/11/" }, { "name":"butterfree", "url":"https://pokeapi.co/api/v2/pokemon/12/" }, { "name":"weedle", "url":"https://pokeapi.co/api/v2/pokemon/13/" }, { "name":"kakuna", "url":"https://pokeapi.co/api/v2/pokemon/14/" }, { "name":"beedrill", "url":"https://pokeapi.co/api/v2/pokemon/15/" }, { "name":"pidgey", "url":"https://pokeapi.co/api/v2/pokemon/16/" }, { "name":"pidgeotto", "url":"https://pokeapi.co/api/v2/pokemon/17/" }, { "name":"pidgeot", "url":"https://pokeapi.co/api/v2/pokemon/18/" }, { "name":"rattata", "url":"https://pokeapi.co/api/v2/pokemon/19/" }, { "name":"raticate", "url":"https://pokeapi.co/api/v2/pokemon/20/" } ] }
注意:cURL 的默认 API 调用方法已经是 GET,因此您实际上不必提供
-X GET
选项部分。因此该命令可以缩写为:curl https://pokeapi.co/api/v2/pokemon
。但是记住此选项很有用,因为您将来可能想要使用 POST 方法,因此下面的命令仍将保留该-X GET
选项。
恭喜,您刚刚使用 cURL 对 PokeAPI 进行了 API 调用!
4)高级——路径参数
路径参数定义在 3.2.2 节中提到。路径参数通常用于获取单个对象的详细信息。
例如,您想要获取有关特定 Pokemon(如 Pikachu)的详细信息。您可以使用“pikachu”作为路径参数并插入到端点中。
要查看有关皮卡丘的具体详细信息,我们的 API 请求的输入是:
- 端点: https://pokeapi.co/api/v2/pokemon/pikachu
- 方法:GET
- 授权:无授权
让我们在 cURL 中编辑端点。cURL 命令现在如下所示:
curl -X GET https://pokeapi.co/api/v2/pokemon/pikachu
让我们复制它,输入到我们的 OS 终端并按回车键进行 API 调用。
输出内容很长,所以我就不放在这里了。它包含有关皮卡丘的能力和许多其他内容的详细信息。
如您所见,更改路径参数就像编辑 API 端点一样简单。
5)高级——查询参数
API 可以提供一种方法来过滤、排序和限制返回的数据。该方法通常是通过查询参数来实现的。有些文档将查询参数仅称为参数。因此,很容易将查询参数与路径参数混淆。
对于 Poke API,只有几个查询参数。其中一个允许 API 请求限制返回的记录数。它在 资源列表/分页部分 中描述。
根据描述,您可以添加一个名为“limit”的查询参数和我们想要的记录数,API 将仅返回指定数量的记录。 例如,您想获取 Pokemon 表上的前 2 个 pokemon。那么我们的 API 请求的输入将是:
- 端点: https://pokeapi.co/api/v2/pokemon
- 方法:GET
- 授权:无授权
- 查询参数:limit : 2
好的,这部分有点棘手,所以请耐心等待。
- 查询参数作为 URL 端点的一部分插入。因此您仍将在此处编辑端点,与路径参数没有区别。问题是,我们如何编辑它。
- 查询参数与端点之间用问号(“?”)隔开
- 问号后,我们输入查询参数名称,后跟等号(“=”),后跟查询参数值。在本例中:
limit=2
- 结合起来,我们现在有了新的端点:
https://pokeapi.co/api/v2/pokemon?limit=2
- 最后一个命令是
curl -X GET https://pokeapi.co/api/v2/pokemon?limit=2
。让我们运行它。以下是输出
{ "count":1281, "next":"https://pokeapi.co/api/v2/pokemon?offset=2&limit=2", "previous":null, "results":[ { "name":"bulbasaur", "url":"https://pokeapi.co/api/v2/pokemon/1/" }, { "name":"ivysaur", "url":"https://pokeapi.co/api/v2/pokemon/2/" } ] }
如果您不使用查询参数,返回的数据将仅显示 2 个神奇宝贝,而不是 20 个。您已成功限制返回的数据。
注意:如果您有多个查询参数,则可以附加下一个参数并用与号(“&”)分隔它们。即
https://pokeapi.co/api/v2/pokemon?offset=2&limit=2