处理 HTTP 请求的响应
在本章中,我们将详细介绍从请求模块收到的响应。我们将讨论以下细节 −
- 获取响应
- JSON 响应
- RAW 响应
- 二进制响应
获取响应
我们将使用 request.get() 方法向 URL 发出请求。
import 请求 getdata = request.get('https://jsonplaceholder.typicode.com/users');
getdata 有响应对象。它包含响应的所有详细信息。我们可以通过两种方式获得响应,即 (text) 和 (.content)。使用 response.text 将以文本格式返回数据,如下所示 −
示例
E:\prequests>python makeRequest.py
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
]
您将看到响应与浏览器中查看 URL 源代码时显示的内容相同,如下所示 −
您还可以尝试 .html URL 并使用 response.text 查看内容,它将与浏览器中 .html URL 的查看源代码内容相同。
现在,让我们对同一 URL 尝试 response.content 并查看输出。
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light
",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "
92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.149
6"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hild
egard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhr
ase": "Multi-layered client-server neural-net",
"bs": "harness real-time
e-markets"
}
},
{
"id": 2,
"name": "Ervin Howell",
"username": "Antonette",
"email": "Shanna@melissa.tv",
"address": {
"street": "Victor Plains",
"suite": "Suite 879",
"city": "Wisoky
burgh",
"zipcode": "90566-7771",
"geo": {
"lat": "-43.950
9",
"lng": "-34.4618"
}
},
"phone": "010-692-6593 x091
25",
"website": "anastasia.net",
"company": {
"name": "Deckow-Crist",
"catchPhrase": "Proactive didactic contingency",
"bs":
"synergize scalable supply-chains"
}
},
{
"id": 3,
"name":
"Clementine Bauch",
"username": "Samantha",
"email":
"Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite
847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"ge
o": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
响应以字节为单位。您将在响应开头看到一个字母 b。使用请求模块,您可以获取所使用的编码,并根据需要更改编码。例如,要获取编码,您可以使用 response.encoding。
print(getdata.encoding)
输出
utf-8
您可以按如下方式更改编码 − 您可以使用您选择的编码。
getdata.encoding = 'ISO-8859-1'
JSON 响应
您还可以使用 response.json() 方法以 json 格式获取 Http 请求的响应,如下所示 −
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.json())
输出
E:\prequests>python makeRequest.py
[{'id': 1, 'name': 'Leanne Graham', 'username': 'Bret', 'email': 'Sincere@april.
biz', 'address': {'street': 'Kulas Light', 'suite': 'Apt. 556', 'city': 'Gwenborough',
'zipcode': '92998-3874', 'geo': {'lat': '-37.3159', 'lng': '81.1496'}},
'
phone': '1-770-736-8031 x56442', 'website': 'hildegard.org', 'company': {'name':
'Romaguera-Crona', 'catchPhrase': 'Multi-layered client-server neural-net', 'bs':
'harness real-time e-markets'}}]
原始响应
如果您需要 Http URL 的原始响应,则可以使用 response.raw,还可以在 get 方法中添加 stream = True,如下所示 −
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users', stream=True)
print(getdata.raw)
输出
E:\prequests>python makeRequest.py <urllib3.response.HTTPResponse object at 0x000000A8833D7B70>
要从原始数据中读取更多内容,您可以按如下方式操作 −
print(getdata.raw.read(50))
输出
E:\prequests>python makeRequest.py b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x95\x98[o\xe38\x12\x85\xdf\xe7W\x10y\ xda\x01F\x82.\xd4m\x9f\xdc\x9dd\xba\xb7\x93\xf4\x06q\xef4\x06\x83A@K\x15\x89m'
二进制响应
要获取二进制响应,我们可以使用 response.content。
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light
",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "
92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.149
6"
}
},
"phone": "1-770-736-8031 x56442",
"website":
"hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhr
ase": "Multi-layered client-server neural-net",
"bs": "harness real-time
e-markets"
}
},
{
"id": 2,
"name": "Ervin Howell",
"us
ername": "Antonette",
"email": "Shanna@melissa.tv",
"address": {
"street": "Victor Plains",
"suite": "Suite 879",
"city": "Wisoky
burgh",
"zipcode": "90566-7771",
"geo": {
"lat": "-43.950
9",
"lng": "-34.4618"
}
},
"phone": "010-692-6593 x091
25",
"website": "anastasia.net",
"company": {
"name": "Deckow-Crist",
"catchPhrase": "Proactive didactic contingency",
"bs": "syn
ergize scalable supply-chains"
}
},
{
"id": 3,
"name":
"Clementine Bauch",
"username": "Samantha",
"email": "Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite
847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"
geo": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
响应以字节为单位给出。您将在响应开头看到一个字母 b。二进制响应主要用于非文本请求。

