当涉及到软件开发时,几乎总是有几种不同的方法来实现相同的结果。在评估第三方软件包家族时,这也是正确的。例如,在Python生态系统中,有数千个与生成Http 请求。你应该用哪一种?
在本基于实验的教程中,我们将介绍一些简短的代码片段,这些代码片段将展示如何使用Python中最流行的5个与请求相关的包来生成一个简单的GET请求。我们将使用美国宇航局的“每日天文照片”API(缩写为APOD在本教程的其余部分中),并在我们的网页浏览器中打开今天的照片。
我们的目标是使用各种Python包快速生成简单的GET请求,而不是比较和对比每个包的所有特性和微妙之处。如果异步请求更适合您的用例,请查看名为带有aiohttp和异步的Python中的异步HTTP请求 .
先决条件- Python 3.6+
- pip , Python包安装程序
导航到Https://api.nasa.gov/。你会在认证节中,您不需要使用唯一的API键来探索NASA数据集。如果您希望无论如何创建一个,请按照网页上的说明,使用给您的API密钥,而不是我们将要使用的demo_key。
演示API密钥的速率限制为每小时30个请求和每天50个请求,如演示键速率限制同一网页的部分。在遵循HTTP请求实验的同时,您应该能够很好地遵守这些限制。NASA网页的这一部分还指出,字符串“demo_key”可以用来代替真正的API键值,这就是我们在本教程中使用的内容。
找到APOD API的URL端点我们将发送HTTP请求到的URL是Https://api.nasa.gov/planetary/apod,您可以通过滚动到浏览API的一节Https://api.nasa.gov/网页并打开APOD下拉菜单:、
如果您阅读APOD下拉列表中显示的简短信息,您将看到这个端点只接受到达方法。这一点很重要,因为我们只需要将到达针对我们将发送的5个不同HTTP请求中的每个请求向端点发出请求。
创建Python虚拟环境为这个项目创建一个名为
Python-http/
在计算机上的适当位置,然后导航到这个新目录。在本例中,我们将使用MacBook的桌面并从命令行创建文件。
$ cd ~/Desktop $ mkdir python-http $ cd python-http
创建一个新的虚拟环境对于这个项目,我们需要安装的依赖项不会干扰计算机上的全局设置。要创建一个名为“env”的新环境,请在命令行上运行以下命令:
$ python3 -m venv env $ source env/bin/activate
在获取虚拟环境之后,您将看到命令提示符的输入行以环境名称(“env”)开头。Python创建了一个名为
环境/
在
Python-http/
目录,您可以通过在命令提示符中运行ls命令来查看该目录。
创建一个名为
.gitignore
在
Python-http/
目录也是。如果您使用Mac上的命令行来创建文件,下面的命令如下:
(env) $ touch .gitignore
打开
.gitignore
文件在您选择的文本编辑器中,然后添加
环境/
文件夹的内容。
.gitignore
档案。当我们在这里时,我们还将为
.env
我们将在下一节中创建的文件。
env/ .env
注意,
环境/
由Python为虚拟环境创建的文件夹与
.env
文件,该文件用于存储API密钥和环境变量等机密信息。
安全地存储环境变量API密钥是敏感信息,应该受到保护。因此,将API键保存为环境变量而不是将它们硬编码到应用程序中是一种最佳实践。我们将遵循这个最佳实践,即使NASA的演示API键值(“demo_key”)是公共知识。
为此,我们可以将api密钥存储在
.env
文件并列出
.env
在我们的
.gitignore
文件(我们已经做过了),这样git就不会跟踪它了。一个
.env
每当需要将环境变量提供给 *** 作系统时,都会使用文件。
首先,创建
.env
档案。这是在Mac命令行上运行的命令:
(env) $ touch .env
接下来,打开
.env
文件放在您最喜欢的文本编辑器中,并添加以下行:
export NASA_API_KEY=DEMO_KEY
来源
.env
文件以使其可供 *** 作系统使用,然后将环境变量值打印到控制台以确认其来源是否成功:
(env) $ source .env (env) $ echo $NASA_API_KEY安装Python依赖项
除了urllib包含在Python标准库中的模块,我们将在HTTP请求实验中使用的第三方Python包是:
- 请求-使用Python进行请求的最流行包
- Urllib 3-不要混淆urllib,它是Python标准库的一部分。
- Httplib2-填补其他图书馆留下的一些空白
- Httpx-提供HTTP/2和异步请求的更新包
Python项目所需的依赖项通常列在一个名为
Requirements.txt
。创建一个
Requirements.txt
文件中的
Python-http/
项目目录:
(env) $ touch requirements.txt
将此Python包列表复制并粘贴到您的
Requirements.txt
使用首选文本编辑器的文件:
requests urllib3 httplib2 httpx
使用下面给出的命令安装所有的依赖项,确保仍然有您的虚拟环境(“env”)源。
(env) $ pip install -r requirements.txt创建Python文件
是时候写些代码了!让我们首先为将要试验的每个模块或包创建一个Python文件:
(env) $ touch use_requests.py (env) $ touch use_urllib3.py (env) $ touch use_httplib2.py (env) $ touch use_httpx.py (env) $ touch use_urllib.py
下面为我们创建的5个不同文件中的每一个提供了代码示例。您还可以在这个GitHub存储库 .
为了使示例更加健壮和有用,我们将使用两个内置的Python模块杰森和网页浏览器所以我们可以在网页浏览器中打开当天的天文图片。
探索5种常用的使用Python发出HTTP请求的方法 5个中的1个:请求这个请求Python包非常受欢迎,目前它是100多万个GitHub存储库中的一个需求,多年来,它的代码库已经有将近600个贡献者!几乎可以肯定的是,该软件包的清晰和简洁的文档对它的广泛使用负有责任。
复制并粘贴此代码片段到
Use_requests.py
档案:
import json import os import webbrowser import requests nasa_api_key = os.environ.get('NASA_API_KEY') api_url = 'https://api.nasa.gov/planetary/apod?api_key={}'.format(nasa_api_key) def use_requests(api_url): response = requests.get(api_url) json_response = json.loads(response.text) photo_url = json_response['url'] webbrowser.open_new_tab(photo_url) return use_requests(api_url)
在上面的示例代码中,我们首先导入所需的所有模块和包。然后,检索存储在
.env
文件(第8行)并将其插入到我们将要发送GET请求的URL中(第9行)。第13行是我们使用请求库的地方,您可以看到语法有多简单。在将照片的URL与API的响应隔离后,我们在第16行的Web浏览器中打开它。
因为函数调用包含在文件的底部,所以您可以运行这个文件,并且照片应该在您的Web浏览器中自动打开!在命令行中运行该文件,自己尝试:
(env) $ python3 use_requests.py5个中的2个:urllib 3
尽管名字很相似,Urllib 3是一个第三方包,与urllib完全不同,urllib是Python标准库的一部分。有超过65万个GitHub存储库将urllib 3列为需求,这使得它成为请求库的一个大受欢迎的替代方案。
复制并粘贴此代码片段到
使用urllib3.py
档案:
import json import os import webbrowser import urllib3 nasa_api_key = os.environ.get('NASA_API_KEY') api_url = 'https://api.nasa.gov/planetary/apod?api_key={}'.format(nasa_api_key) def use_urllib3(api_url): http = urllib3.PoolManager() response = http.request('GET', api_url) json_response = json.loads(response.data) photo_url = json_response['url'] webbrowser.open_new_tab(photo_url) return use_urllib3(api_url)
在上面的示例代码中,我们首先导入所需的所有模块和包。然后,检索存储在
.env
文件(第8行)并将其插入到我们将要发送GET请求的URL中(第9行)。在第13行和第14行,我们使用urllib 3包,然后处理响应,提取照片的URL并在Web浏览器中显示它。
因为在文件底部包含一个函数调用,所以您可以运行这个文件并确保它工作。
小贴士:如果你遇到了一个错误,比如[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate在尝试运行该文件时,请按照这个StackOverflow线程来解决这个问题。
(env) $ python3 use_urllib3.py5中3:httplib2
这个Httplib2软件包是86,000个GitHub存储库的要求。Httplib2的使用远远落后于请求和urllib 3包的使用,然而httplb 2填补了这两个更广泛使用的替代方案留下的一些空白。例如,httplib2支持持久连接和缓存。
下面是一个简单的示例,说明如何在项目中使用httplib2。复制并粘贴以下代码到
使用httplib2.py
:
import json import os import webbrowser import httplib2 nasa_api_key = os.environ.get('NASA_API_KEY') api_url = 'https://api.nasa.gov/planetary/apod?api_key={}'.format(nasa_api_key) def use_httplib2(api_url): http = httplib2.Http() # The response is sent as a 2-item tuple, with the content at index 1 response = http.request(api_url) json_response = json.loads(response[1]) photo_url = json_response['url'] webbrowser.open_new_tab(photo_url) return use_httplib2(api_url)
在上面的示例代码中,我们首先导入所需的所有模块和包。然后,检索存储在
.env
文件(第8行)并将其插入到我们将要发送GET请求的URL中(第9行)。在第13行和第16行中,我们使用httplib2包,然后处理响应以提取照片的URL并在Web浏览器中显示它。
由于文件底部包含一个函数调用,所以可以运行该文件并确保其工作:
(env) $ python3 use_httplib2.py5中4:httpx
这个HttpxPython包是我们列表中最新的一个。它支持Http/2协议和异步请求除了标准同步Http/1协议。它构建为非常“类似于请求”,并且反映了请求包中的许多代码模式(我们讨论的第一个)。
若要尝试httpx,请将以下代码复制并粘贴到
使用httpx.py
档案:
import json import os import webbrowser import httpx nasa_api_key = os.environ.get('NASA_API_KEY') api_url = 'https://api.nasa.gov/planetary/apod?api_key={}'.format(nasa_api_key) def use_httpx(api_url): request = httpx.get(api_url) json_request = request.json() photo_url = json_request['url'] webbrowser.open_new_tab(photo_url) return use_httpx(api_url)
在上面的示例代码中,我们首先导入所需的所有模块和包。然后,检索存储在
.env
文件(第8行)并将其插入到我们将要发送GET请求的URL中(第9行)。第13行是我们使用httpx库的地方,您可以看到语法有多简单。在将照片的URL与API的响应隔离后,我们在第16行的Web浏览器中打开它。
因为函数调用包含在文件的底部,所以您可以运行这个文件,并且照片应该在您的Web浏览器中自动打开!在CLI中运行该文件以自己尝试:
(env) $ python3 use_httpx.py5个中的5个:urllib
与使用上面一节中的请求包进行HTTP请求相比,使用Python的内置乌尔利卜模块有点复杂。它需要使用上下文管理器除了解码响应--在使用本教程中的一个包时,通常会从开发人员中抽象出两件事情。
复制并粘贴此示例代码到
使用urllib.py
档案:
import json import os import urllib.request import webbrowser nasa_api_key = os.environ.get('NASA_API_KEY') api_url = 'https://api.nasa.gov/planetary/apod?api_key={}'.format(nasa_api_key) def use_urllib(api_url): request = urllib.request.Request(api_url) with urllib.request.urlopen(request) as response: data = json.loads(response.read().decode("utf-8")) photo_url = data['url'] webbrowser.open_new_tab(photo_url) return use_urllib(api_url)
在上面的示例代码中,我们首先导入所需的所有模块和包。然后,检索存储在
.env
文件(第7行)并将其插入到我们将要发送GET请求的URL中(第8行)。第12行使用urllib模块创建请求对象,第13行使用上下文管理器(with...)将请求发送到APOD端点并保存响应。在第14行,我们解码响应并将其转换为JSON,然后提取照片的URL并在第15和第16行的浏览器中打开它。
由于文件底部包含一个函数调用,所以可以运行该文件并确保其工作:
(env) $ python3 use_urllib.py祝贺你!
很好的工作通过本教程!你刚刚学会了如何:
- 将api密钥和其他秘密安全地存储在
.env
档案 - 以5种不同的方式向API端点发出GET请求
- 在web浏览器中打开Python脚本中的图像
为了扩展我们使用Python以5种不同方式发出HTTP请求的实验,您可以:
- 试试其他的与http有关和请求相关在PyPI中列出的包。
- 做一些你自己的研究,比较本教程中使用的每个软件包的优缺点。
- 选择我们在本教程中介绍的包之一,并使用它的文档生成更复杂类型的HTTP请求,比如使用缓存的请求。
- 尝试使用支持这些方法的API发出POST、PUT或DELETE请求。
需要完整源代码或视频教程的点这里!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)