介绍
在许多网络应用中,通过使用API连接到各种第三方服务是正常的. 当您使用这些API时,您可以访问诸如天气信息,运动分数,电影上市,微博,搜索引擎结果以及图片等数据. 您也可以使用 API 来向您的应用程序添加功能 。 这些例子包括付款、时间安排、电子邮件、翻译、地图和文件转账。 如果你要自己创建其中的任何一个,它需要很多时间,但是有了API,连接到一个并且访问它的特性和数据只需要几分钟.
在本文中,您将了解有关 Python 请求库,它允许您在 Python 中发送 HTTP 请求。
<$>[警告] 警告: 本教程的下半部分依赖于Yandex.Translate的免费API密钥. 在此时刻,这些不再被自由发行。
由于使用API是发送HTTP请求和接收响应,请求允许您在Python中使用API。
前提条件
要完成本教程,您将需要:
- 此项目将需要 Python 安装在本地环境中。
理解 HTTP 请求
HTTP请求是网页的运作方式.每次你导航到网页时,你的浏览器会向网页的服务器发出多个请求。
一般过程是这样的:
- 客户端(例如使用请求的浏览器或Python脚本)会将一些数据发送到URL。 * 然后,位于URL的服务器会读取数据,决定如何处理数据,并返回客户端的回复。
客户端在请求中发送的数据的一部分是请求方法. 一些常见的请求方法是 GET、POST 和 PUT. GET 请求通常只用于读取数据而不会对任何东西进行更改,而 POST 和 PUT 请求通常用于修改服务器上的数据。
注意:本文将涵盖 GET 请求,因为我们不会在服务器上修改任何数据。
当您从 Python 脚本或在 Web 应用程序中发送请求时,开发者可以决定每个请求中发送的内容以及应对的内容,因此,让我们先通过向 DigitalOcean.com 发送请求,然后使用语言翻译 API 来探索这一点。
第1步:安装Python请求
首先创建 虚拟环境是很好的想法,如果你还没有一个。
然后,您需要安装图书馆,让我们使用pip
来安装请求。
1pip install requests
此时,您的项目已准备好使用请求。
第2步:提出你的第一个请求
首先,让我们使用请求请求到DigitalOcean网站。
在本文中,我们不会有太多代码来工作,所以当事情发生变化时,你可以简单地更新现有的代码而不是添加新行。
1[label script.py]
2import requests
3
4res = requests.get('https://www.digitalocean.com/')
5
6print(res)
因此,所有这个代码正在做的是发送一个GET请求到DigitalOcean. 这是同一种类型的请求,您的浏览器发送来查看此页面,但唯一的区别是请求实际上不能渲染HTML,所以您只会得到原始HTML和其他响应信息。
在这里,您正在使用.get()
函数,但请求允许您使用其他函数,如.post()
和.put()
来发送这些请求。
您可以通过执行script.py
文件来运行它。
1python script.py
以下是你得到的回报:
1[secondary_label Output]
2<Response [200]>
接下来,让我们来研究一个200状态代码的含义。
第3步:理解状态代码
您可以做的第一件事是检查状态代码. HTTP 代码范围从 1XX 到 5XX. 您可能看到的常见状态代码是 200、404 和 500。
以下是每个状态代码意味着什么的快速概述:
- 1XX - 信息 * 2XX - 成功 * 3XX - 重定向 * 4XX - 客户端错误(您犯了一个错误) * 5XX - 服务器错误(他们犯了一个错误)
一般来说,当您执行自己的请求时,您正在寻找的是200年代的状态代码。
请求识别 4XX 和 5XX 状态代码为错误,因此如果返回这些状态代码,请求中的响应对象将被评估为错误
。
您可以通过检查答案是否真实来测试请求是否成功响应。
1[label script.py]
2if res:
3 print('Response OK')
4else:
5 print('Response Failed')
以下是你得到的回报:
1[secondary_label Output]
2<Response [200]>
3Response OK
只有当返回 400 或 500 状态代码时才会出现响应失败
的消息,请尝试将 URL 更改为一些荒谬,以便在 404 中看到响应失败。
您可以通过添加直接查看状态代码:
1[label script.py]
2print(res.status_code)
这将直接向您显示状态代码,以便您可以自行检查号码。
1[secondary_label Output]
2<Response [404]>
3Response Failed
4404
这显示了响应、脚本消息和响应状态代码。
步骤4:理解头条
您可以从答案中获得的另一个东西是标题,您可以使用响应对象上的标题字典来查看它们。
1[label script.py]
2print(res.headers)
这产生了以下产出:
1[secondary_label Output]
2{'Date': 'date', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': '__cfduid=id; expires=date; path=/; domain=.digitalocean.com; HttpOnly; SameSite=Lax', 'Last-Modified': 'date', 'Vary': 'Accept-Encoding', 'ETag': 'etag', 'Expires': 'date', 'Cache-Control': 'max-age=time, public', 'Content-Encoding': 'gzip', 'CF-Cache-Status': 'DYNAMIC', 'cf-request-id': 'id', 'Expect-CT': 'max-age=time, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': 'ray'}
标题与请求一起发送,并在响应中返回,以便客户端和服务器都知道如何解释在响应中发送和接收的数据。
你可以看到返回的各种标题,很多时候你不需要直接使用标题信息,但如果你需要它,它就在那里。
内容类型通常是您可能需要的类型,因为它显示了数据的格式(HTML、JSON、PDF、文本等)。
第5步:理解答案文本
最后,如果你看看‘res.text’(它适用于文本数据,例如您目前正在浏览的HTML页面),你可以看到构建DigitalOcean主页所需的所有HTML。
1[label script.py]
2print(res.text)
这产生了以下产出:
1[secondary_label Output]
2<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
3
4[...]
5
6<title data-react-helmet="true">DigitalOcean – The developer cloud</title><meta data-react-helmet="true" name="description" content="Helping millions of developers easily build, test, manage, and scale applications of any size – faster than ever before."/>
7
8[...]
如果你将此存储到文件中,然后打开它,你会看到类似于DigitalOcean网站的东西。在现实情况下,为单个网页发出多个请求,以加载像图像、脚本和样式表等东西,所以如果只将HTML保存到一个文件中,它不会看起来像你的浏览器中的DigitalOcean网站,因为只执行了一个请求来获取HTML数据。
第6步:使用翻译API
现在让我们转向一些更有趣的东西,您将使用Yandex翻译API执行请求,将某些文本翻译到不同的语言。
要使用 API,首先你需要登录. 登录后,前往翻译 API 并创建 API 密钥. 一旦你有 API 密钥,将其添加到你的文件作为常数。 这里是你可以做所有这些事情的链接: https://tech.yandex.com/translate/
1[label script.py]
2API_KEY = 'your yandex api key'
为什么你需要一个API密钥的原因是,Yandex可以每次你想要使用他们的API来验证我们,API密钥是一种轻量级的验证形式,因为它在发送时被添加到请求URL的末尾。
要知道您需要发送哪个 URL 才能使用 API,您可以查看 Yandex 的文档。
如果你在那里看,你会看到使用他们的翻译API来翻译文本所需的所有信息。
1https://translate.yandex.net/api/v1.5/tr.json/translate
2 ? key=<API key>
3 & text=<text to translate>
4 & lang=<translation direction>
5 & [format=<text format>]
6 & [options=<translation options>]
7 & [callback=<name of the callback function>]
当您看到一个具有 ampersands (&
), 问题标记 (?
) 和等于符号 (=
) 的 URL 时,您可以确定该 URL 是用于 GET 请求。
通常,方块([])中的东西将是可选的,在这种情况下,
格式、
选项和
回调是可选的,并且要求需要
密钥、
文本和
长度`。
因此,让我们添加一些代码发送到该 URL. 您可以用以下代替您创建的第一个请求:
1[label script.py]
2url = 'https://translate.yandex.net/api/v1.5/tr.json/translate'
3res = requests.get(url)
有两种方式可以添加参数. 您可以直接将其附加到URL的末尾,或者您可以要求请求为您做。 为了完成后者,您可以为我们的参数创建一个字典。 您需要的三个项目是密钥、文本和语言。 让我们使用API密钥创建字典,Hello
为文本,和en-es
为lang,这意味着您想从英语翻译到西班牙语。
如果您需要了解其他语言代码,请参阅 ISO 639-1 代码列表。
您可以使用 dict()
函数创建 params 字典,并在字典中输入所需的键和值。
1[label script.py]
2params = dict(key=API_KEY, text='Hello', lang='en-es')
现在我们采取参数字典并将其传递到 .get()
函数。
1[label script.py]
2res = requests.get(url, params=params)
当您以这种方式传输参数时,请求将继续并为您添加参数到 URL。
现在,让我们为响应文本添加一个打印
声明,并查看响应中返回的内容。
1[label script.py]
2print(res.text)
这产生了以下产出:
1[secondary_label Output]
2{"code': 200, "lang": "en-es", "text": ["Hola"]}
你会看到状态代码,这是同一个状态代码的答案本身,你会看到你指定的语言,你会看到翻译的文本在列表中,所以你应该看到你好
翻译的文本。
再次尝试使用en-fr
作为语言代码,您现在应该在回复中看到‘Bonjour’
。
1[label script.py]
2params = dict(key=API_KEY, text='Hello', lang='en-fr')
这产生了以下产出:
1[secondary_label Output]
2{"code": 200, "lang": "en-fr", "text": ["Bonjour"]}
让我们来看看这个特定的答案的标题。
1[label script.py]
2print(res.headers)
这产生了以下产出:
1[secondary_label Output]
2{'Server': 'nginx/1.6.2', 'Date': 'Sat, 20 Apr 2019 08:57:01 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length": '46', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=120', 'X-Content-Type-Options': 'nosniff', 'Cache-Control': 'no-store'}
标题应该是不同的,因为您正在与不同的服务器进行通信,但在这种情况下,内容类型是application/json
而不是text/html
。
当应用程序/json
是响应的内容类型时,您可以让请求将响应转换为字典和列表,以便您更容易访问数据。
要将数据解析为 JSON,您可以在响应对象上使用 .json()
方法。
如果您打印它,您会看到数据看起来相同,但格式略有不同。
1[label script.py]
2json = res.json()
3print(json)
这产生了以下产出:
1[secondary_label Output]
2{'code': 200, 'lang': 'en-fr', 'text': ['Bonjour']}
原因是它不同的是,你从res.text
中获得的文本不再是纯文本,这次是字典的印刷版本。
假设你想要访问文本. 因为这现在是一个字典,你可以使用文本
密钥。
1[label script.py]
2print(json['text'])
这产生了以下产出:
1[secondary_label Output]
2['Bonjour']
在这种情况下,你正在查看一个项目的列表,所以如果你想直接在列表中获得该文本,你可以通过索引访问它。
1[label script.py]
2print(json['text'][0])
这产生了以下产出:
1[secondary_label Output]
2Bonjour
现在你看到的唯一东西是翻译的词。
如果你更改你的参数,你会得到不同的结果. 让我们更改要翻译的文本从你好
到再见
,更改目标语言返回西班牙语,然后再次发送请求。
1[label script.py]
2params = dict(key=API_KEY, text='Goodbye', lang='en-es')
这产生了以下产出:
1[secondary_label Output]
2Adiós
尝试将更长的文本翻译成不同的语言,看看API给你的答案是什么。
第7步:处理翻译API错误案例
最后,我们将看看一个错误案例:一切并不总是有效的,所以你需要知道什么时候会发生。
尝试通过删除一个字符来更改您的 API 密钥. 当您这样做时,您的 API 密钥将不再有效。
如果你看看状态代码,这是你得到的:
1[label script.py]
2print(res.status_code)
这产生了以下产出:
1[secondary_label Output]
2403
当您使用API时,您将想要检查事情是否成功,以便根据应用程序的需求处理错误案例。
结论
在本文中,您了解了 Python 请求库,它允许您在 Python 中发送 HTTP 请求。
以下是你学到的:
- HTTP 请求是如何工作的 * 响应中可能的各种状态代码 * 如何使用 Python 请求库发送请求和接收响应 * 如何使用语言翻译 API 来翻译文本 * 如何将
应用程序/json
内容的响应转换为字典
如果您想了解更多关于 Python 的信息,请参阅 我们的 React 主题页面以获取练习和编程项目。