让我们首先安装requests库。为此,请运行以下命令:
pip install requests
如果你喜欢使用 Pipenv 管理Python包,你可以运行下面的命令:
pipenv install requests
一旦安装了requests,你就可以在应用程序中使用它。像这样导入requests:
import requests
现在你已经都准备完成了,那么是时候开始使用requests的旅程了。你的第一个目标是学习如何发出GET请求。
GET 请求
HTTP方法(如GET和POST)决定当发出HTTP请求时尝试执行的操作。除了GET和POST之外,还有其他一些常用的方法,你将在本教程的后面部分使用到。
最常见的HTTP方法之一是GET。GET方法表示你正在尝试从指定资源获取或检索数据。要发送GET请求,请调用requests.get()。
你可以通过下面方式来向GitHub的 Root REST API 发出GET请求:
>>> requests.get( https://api.github.com )
恭喜!你发出了你的第一个请求。接下来让我们更深入地了解该请求的响应。
响应
Response是检查请求结果的强有力的对象。让我们再次发出相同的请求,但这次将返回值存储在一个变量中,以便你可以仔细查看其属性和方法:
>>> response = requests.get( https://api.github.com )
在此示例中,你捕获了get()的返回值,该值是Response的实例,并将其存储在名为response的变量中。你现在可以使用response来查看有关GET请求结果的全部信息。
状态码
您可以从Response获取的第一部分信息是状态码。状态码会展示你请求的状态。
例如,200OK状态表示你的请求成功,而404NOT FOUND状态表示找不到你要查找的资源。还有许多其它的状态码 ,可以为你提供关于你的请求所发生的具体情况。
通过访问.status_code,你可以看到服务器返回的状态码:
>>> response.status_code
200
.status_code返回200意味着你的请求是成功的,并且服务器返回你要请求的数据。
有时,你可能想要在代码中使用这些信息来做判断:
if response.status_code == 200:
print( Success! )
elif response.status_code == 404:
print( Not Found. )
按照这个逻辑,如果服务器返回200状态码,你的程序将打印Success!如果结果是404,你的程序将打印NotFound.。
requests更进一步为你简化了此过程。如果在条件表达式中使用Response实例,则在状态码介于200和400之间时将被计算为为True,否则为False。
因此,你可以通过重写if语句来简化上一个示例:
if response:
print( Success! )
else:
print( An error has occurred. )
技术细节: 因为__bool__()是Response上的重载方法 ,因此真值测试才成立。
这意味着重新定义了Response的默认行为,用来在确定对象的真值时考虑状态码。
技术细节: 因为__bool__()是Response上的重载方法 ,因此真值测试才成立。
这意味着重新定义了Response的默认行为,用来在确定对象的真值时考虑状态码。
请记住,此方法不会验证状态码是否等于200。原因是200到400范围内的其他状态代码,例如204NO CONTENT和304NOT MODIFIED,就意义而言也被认为是成功的响应。
例如,204告诉你响应是成功的,但是下消息体中没有返回任何内容。
因此,通常如果你想知道请求是否成功时,请确保使用这方便的简写,然后在必要时根据状态码适当地处理响应。
假设你不想在if语句中检查响应的状态码。相反,如果请求不成功,你希望抛出一个异常。你可以使用.raise_for_status()执行此操作:
import requests
from requests.exceptions import HTTPError
for url in [ https://api.github.com , https://api.github.com/invalid ]:
try:
response = requests.get(url)
# If the response was successful, no Exception will be raised
response.raise_for_status()
except HTTPError as http_err:
print(f HTTP error occurred: {http_err} ) # Python 3.6
except Exception as err:
print(f Other error occurred: {err} ) # Python 3.6
else:
print( Success! )
如果你调用.raise_for_status(),将针对某些状态码引发HTTPError异常。如果状态码指示请求成功,则程序将继续进行而不会引发该异常。
进一步阅读:如果你不熟悉Python 3.6的 f-strings,我建议你使用它们,因为它们是简化格式化字符串的好方法。
进一步阅读:如果你不熟悉Python 3.6的 f-strings,我建议你使用它们,因为它们是简化格式化字符串的好方法。
现在,你对于如何处理从服务器返回的响应的状态码了解了许多。但是,当你发出GET请求时,你很少只关心响应的状态码。通常,你希望看到更多。接下来,你将看到如何查看服务器在响应正文中返回的实际数据。
响应内容
GET请求的响应通常在消息体中具有一些有价值的信息,称为有效负载。使用Response的属性和方法,你可以以各种不同的格式查看有效负载。
要以 字节 格式查看响应的内容,你可以使用.content:
>>> response = requests.get( https://api.github.com )
>>> response.content
b {"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?