使用 Python 发送 API 请求
Python 正在经历复兴。它从未真正消失,但如今的使用量以前所未有的速度增长。随着机器学习开发者和数据科学家对 Python 的依赖,围绕该语言构建的整个 Web 开发生态系统也在不断发展壮大。
这三个方向都受到 API 强大功能的共同影响。获取数据并连接外部服务是任何编程语言的核心功能。本文将介绍用于发出 HTTP 请求的主要库,以及一些常见的 Python API 连接用例。在此之前,我们应该先提出一个重要的问题。
Python适合开发API吗?
这个问题看似奇怪,但考虑到 Node.js 和 Ruby 在网络上的广泛应用,你可能会认为 Python 不适合进行 API 调用。事实并非如此。实际上,Python 在 Web 开发领域有着悠久而稳定的发展历史,尤其体现在其 Flask 和 Django 库上。
由于 Python 是一种功能强大且易于使用的数据处理工具,因此用它来获取数据源也是理所当然的。这就需要用到 API 调用了。让我们从最流行的用于进行 API 调用的 Python HTTP 库Requests开始。
请求
Requests 是一个易于使用且领先的库,开发者通常使用它在 Python 中发起 API 请求。它提供了一个用于同步发送 HTTP 请求的接口。接下来,我们将直接介绍一些可以使用 Requests 发起的常见请求类型。以下示例均假设您的项目已包含 Requests。您可以按照其安装说明进行操作,但要点如下:
pip通过以下方式安装pipenv:
pip install requests
然后,确保将请求导入到您的项目中。
import requests
使用 Requests 进行 API 调用的常见类型
最简单的GET请求也是最直观的。
response = requests.get('https://example.com')
如上例所示get,Requests 为 HTTP 动词提供了快捷方法,包括POST、PUT、DELETE、HEAD和OPTIONS。
之前的请求非常简单。我们来看一些更复杂的请求。通常,API 文档会要求你向特定的端点传递查询参数。要传递查询参数,我们可以将其get作为第二个参数传递。
response = requests.get('https://example.com', params={'name': 'Bearer'})
该response变量包含示例中 API 返回的数据。访问这些数据主要有三种方式。
- 作为文本,
response.text - 咬一口
response.content - 以 JSON 格式
response.json() - 或者作为原始响应
response.raw
除了响应体之外,我们还可以使用 `getStatusCode` 访问状态码response.status_code,使用 `getHeaders` 访问请求头response.headers,等等。您可以Response 在 requests.Response 文档中找到所有可用属性和方法的完整列表。
正如我们在params论证中看到的,我们也可以向请求传递标头。
response = requests.get('https://example.com, headers={'example-header': 'Bearer'})
这里,我们传递headers一个包含 headers 的 Python 字典作为参数。
我们将要介绍的最后一种常见的 API 调用类型是功能齐全的POST,带有身份验证。这将结合之前提到的请求头技术和参数的使用data。
url = 'https://example.com'
headers = {'Authorization': 'Bearer example-auth-code'}
payload = {'name':'Mark', email: 'mark@bearer.sh'}
response = requests.post(url, headers=headers, data=payload)
这会将有效负载作为表单编码的数据发送。对于大多数现代 API,我们通常需要以 JSON 格式发送数据。在接下来的示例中,我们将使用requests 库内置的 JSON 辅助函数。
url = 'https://example.com'
headers = {'Authorization': 'Bearer example-auth-code'}
payload = {'name':'Mark', email: 'mark@bearer.sh'}
response = requests.post(url, headers=headers, json=payload)
这将把有效负载编码为 JSON,并自动将Content-Type标头更改为application/json。
Requests 库非常适合同步 API 调用,但有时你的应用可能需要异步请求。为此,我们可以使用像aiohttp这样的异步 HTTP 库。
aiohttp
在进行异步 HTTP 请求时,你需要利用 Python 3 的一些新特性。虽然 requests 库提供了一些变体和插件来处理异步编程,但 aiohttp 是更流行的异步库之一。结合 asyncio ,我们可以使用aiohttp以异步方式发送请求。代码会稍微复杂一些,但它提供了异步调用带来的所有额外自由。
首先,我们需要安装aiohttp。
安装aiohttp。
pip install aiohttp
使用 aiohttp 的常见 API 调用类型
我们将从之前看到的相同GET请求开始。首先,导入这两个库,并定义一个异步函数。
import asyncio # [1]
import aiohttp
async def main(): # [2]
async with aiohttp.ClientSession() as session: # [3]
async with session.get('http://example.com') as resp: # [4]
response = await resp.read() # [5]
print(response)
asyncio.run(main()) # [6]
上面的代码执行了以下操作:
- 我们导入所需的库。
- 定义
main为异步函数。 - 我们建立了一个
ClientSession表单aiohttp。 - 我们使用会话来执行 HTTP GET 请求。
- 接下来,我们等待回复并将其打印出来。
- 最后,我们使用
runPython 的 asyncio 方法来调用异步函数。
如果您之前没有在 Python 中使用过异步操作,那么与之前的示例相比,这看起来可能会很奇怪也很复杂。异步操作的开发者aiohttp建议为每个应用程序设置一个单独的会话,并在该会话中打开/关闭连接。为了使我们的示例更完整,我保留了效率较低的格式。
接下来,让我们来看一个POST带有身份验证标头的完整功能,就像请求示例中那样。
# ...
async def main():
async with aiohttp.ClientSession() as session:
async with session.post('http://example.com',
headers={'Authorization':'Bearer 123456', 'Content-Type':'application/json'},
json={'title':'Try Bearer'}) as resp: # [1]
response = await resp.json() # [2]
print(response)
asyncio.run(main())
这个例子和前一个例子有一些不同之处:
- 会话使用该
post方法,除了 URL 之外,还传入标头和 json 字典。 - 我们使用库的内置
json方法来解析响应中返回的 json。
有了这两段代码,我们就能完成大多数常见的 API 相关任务。如需了解文件上传和表单数据等其他功能,请参阅aiohttp 的开发者文档。
可以尝试的其他库
虽然Requests是最受欢迎的,但对于一些更独特的用例,您可能会发现以下一些额外的库很有价值。
- httpx:
httpx同时支持同步和异步请求。它还使用与 requests 兼容的 API,这使得在两者之间切换更加便捷。目前该库处于 beta 测试阶段,预计 1.0 版本将于 2020 年夏季发布,但值得关注其后续发展。 - httpcore:延续 1.0 版本之前的趋势,
httpcore如果你正在构建一个库,它是一个不错的选择。它是底层库,因此你可以在其基础上构建自己的抽象层。官方明确建议,除非你需要一个底层库,否则不要使用它。 - urllib3:我们应该推荐
urllib3它,原因很简单,它是 Requests 和许多其他库(包括 pip)的底层库。虽然 urllib3 的用户友好性不如一些高级库,但它功能强大且久经考验。如果您出于某种原因需要比 requests 抽象层级更少的工具,那么 urllib3 是一个不错的选择。
充分利用 API 调用
凭借 Python 在数据处理方面的强大功能以及近年来在机器学习和数据科学社区的推动下取得的复兴,它已成为与 API 交互的绝佳选择。但需要注意的是,即使是最久经考验、最流行的第三方 API 和服务也难免会出现问题和故障。Bearer 致力于开发工具,帮助您管理这些问题并更好地监控第三方 API。立即试用 Bearer,并告诉我们您的想法!
文章来源:https://dev.to/bearer/making-api-requests-with-python-2h3i