当前位置: 首页 > 科技观察

在Python中发出HTTP请求的4种方法

时间:2023-03-17 12:07:40 科技观察

python包索引(PyPI)提供了超过100,000个代码库的包,可以帮助python程序员做很多事情,无论是构建Web应用程序还是分析数据。此外,PyPI还提供了很多API的辅助库,比如twilio。让我们通过学习如何使用4个不同的PythonHTTP库从RESTfulAPI检索和解析JSON数据来展示PyPI包的强大功能。本文中的每个示例都包含以下内容:定义要解析的URL,我们将使用SpotifyAPI,因为它不需要根据请求进行身份验证。创建HTTPGET以请求此URL。解析返回的JSON数据。我们将使用的四个库使用不同的方法来实现相同的结果。如果您输出结果,您将看到一个包含Spotify搜索结果的字典:*注意:结果可能因您使用的Python版本而异。在本文中,所有代码都是用Python3编写的。如果您仍在使用Python2.X,请考虑为Python3设置一个virtualenv。以下说明将帮助您在Python3中使用virtualenv:创建一个名为pythreetest的目录用于Python3测试。安装virtualenv后,从项目目录执行以下命令:使用以下命令创建一个新的virtualenv:virtualenv-ppython3myvenv使用source命令激活myvenv:sourcemyvenv/bin/activate现在您将能够使用pip安装所需的库并将它们安装在virtualenv中以Python3启动解释器,您可以在其中成功导入包。urlliburllib是内置于Python标准库中的模块,使用http.client实现HTTP和HTTPS协议的客户端。由于urllib是随Python一起分发和安装的,因此无需使用pip来安装它。如果您重视稳定性,那么这适合您。twilio-python帮助程序库使用urllib。urllib比其他库需要更多的工作。例如:您必须在发出HTTP请求之前创建一个URL对象。importurllib.requestimporturllib.parseurl='https://api.spotify.com/v1/search?type=artist&q=snoop'f=urllib.request.urlopen(url)print(f.read().decode('utf-8'))在上面的例子中,我们将请求URL发送到CGI的stdin,并读取返回给我们的数据。RequestsRequests是Python社区中最受欢迎的库,因为它简单易用。Requests由urllib3提供支持,有人开玩笑说它是“唯一适合人类使用的非转基因HTTP库”。Requests抽象了很多编程代码,使得HTTP请求比使用内置的urllib库简单得多。先用pip安装pipinstallrequests发送请求到Spotifyimportrequestsr=requests.get('https://api.spotify.com/v1/search?type=artist&q=snoop')r.json()输出结果:frompprintimportpprintpprint(r.json())我们刚刚向Spotify发出了一个GET请求,创建了一个名为r的Response对象,然后使用内置的JSON解码器来处理我们请求的内容。OctopusOctopus适用于想要获得一切的开发人员。它允许您通过多任务访问Spotify。就像它的名字一样,这个库使用线程来同时检索和报告HTTP请求的完成,同时使用您熟悉的库。或者,您可以使用Tornado的IOLoop进行异步请求,但我不会在这里尝试。通过pip安装:pipinstalloctopus-httpOctopus比前面的例子多了一些设置。我们必须构建一个响应处理程序并使用内置的JSON库对JSON进行编码。importjsonfrompprintimportpprintfromoctopusimportOctopusdefcreate_request(urls):data=[]otto=Octopus(并发=4,auto_start=True,cache=True,expiration_in_seconds=10)defhandle_url_response(url,response):if"Notfound"==response.text:print("URLNotFound:%s"%url)else:data.append(response.text)forurlinurls:otto.enqueue(url,handle_url_response)otto.wait()json_data=json.JSONEncoder(indent=None,separators=(',',':')).encode(data)returnpprint(json_data)print(create_request(['https://api.spotify.com/v1/search?type=artist&q=snoop','https://api.spotify.com/v1/search?type=artist&q=dre']))在上面的代码片段中,我们定义了create_requests函数来使用线程Octopus请求。我们从一个空列表、数据开始,并创建一个Octopus类的实例dotto。最后配置默认设置。然后我们构造响应处理程序,其中响应参数是Octopus.Response的一个实例。每次请求成功后,都会将响应内容添加到数据列表中。在响应处理程序中,我们可以使用Octopus类的主要方法。.enqueue方法用于对新的URL进行排队。我们指定.wait方法等待队列中的所有URL完成加载,然后对JSON列表进行JSON编码并打印结果。哇,终于结束了。HTTPieHTTPie适用于希望快速与HTTP服务器、RESTfulAPI和Web服务进行交互的开发人员,它只需要一行代码。这个库是“一个会让你微笑的开源CLIHTTP客户端:一个用户友好的Curl替代方案”。虽然它不依赖于Python环境,但可以通过Pip安装并用于创建HTTP请求。pipinstallhttpie的默认协议是HTTP,但您可以创建别名并将HTTPS重置为默认协议,如下所示:aliashttps='http--default-scheme=https',然后创建请求:https"https://api.spotify。com/v1/search?type=artist&q=snoop"使用HTTPie只需要URL。最后的想法Python生态系统提供了许多与JSONAPI交互的选项。虽然最简单的请求的方法相似,但随着HTTP请求复杂性的增加,差异变得更加明显。尝试一些,看看哪一个最适合您的需求。您甚至可以尝试另一种语言,例如Ruby。