构建HTTP请求
构建请求URL参数
https://www.baidu.com/s?wd=iphone&rsv_spt=1
问号后面的部分 wd=iphone&rsv_spt=1 就是 url 参数,每个参数之间是用 & 隔开的。
但是有的时候,我们的url参数里面有些特殊字符,比如 参数的值就包含了 & 这个符号。
那么我们可以把这些参数放到一个字典里面,然后把字典对象传递给 Requests请求方法的 params 参数,如下
urlpara = {
'wd':'iphone&ipad',
'rsv_spt':'1'
}
response = requests.get('https://www.baidu.com/s',params=urlpara)
构建请求消息头
每个消息头也就是一种 键值对的格式存放数据,如下所示
user-agent: my-app/0.0.1
auth-type: jwt-token
headers = {
'user-agent': 'my-app/0.0.1',
'auth-type': 'jwt-token'
}
r = requests.post("http://httpbin.org/post", headers=headers)
print(r.text)
构建请求消息体
Web API接口中,消息体基本都是文本,文本的格式主要是这3种: urlencoded ,json , XML。
XML 格式消息体
如果设计者决定用 XML 格式传输一段信息,用Requests库,只需要这样
payload = '''
良好
暂无
'''
r = requests.post("http://httpbin.org/post",
data=payload.encode('utf8'))
print(r.text)
urlencoded 格式消息体
这种格式的消息体就是一种 键值对的格式存放数据,如下所示
key1=value1&key2=value2
然后使用post方法的时候,指定参数 data 的值为这个字典就可以了,如下
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
json 格式消息体
可以使用json库的dumps方法,如下
import requests,json
payload = {
"Overall":"良好",
"Progress":"30%",
"Problems":[
{
"No" : 1,
"desc": "问题1...."
},
{
"No" : 2,
"desc": "问题2...."
},
]
}
r = requests.post("http://httpbin.org/post", data=json.dumps(payload))
也可以将 数据对象 直接 传递给post方法的 json参数,如下
r = requests.post("http://httpbin.org/post", json=payload)
检查HTTP响应
检查响应状态码
要检查 HTTP 响应 的状态码,直接 通过 reponse对象的 status_code 属性获取
import requests
response = requests.get('http://mirrors.sohu.com/')
print(response.status_code)
检查响应消息头
要检查 HTTP 响应 的消息头,直接 通过 reponse对象的 headers 属性获取
import requests,pprint
response = requests.get('http://mirrors.sohu.com/')
print(type(response.headers))
pprint.pprint(dict(response.headers))
运行结果如下
<class 'requests.structures.CaseInsensitiveDict'>
{'Cache-Control': 'no-store',
'Connection': 'keep-alive',
'Content-Type': 'text/html; charset=utf8',
'Date': 'Sat, 21 Sep 2019 09:02:32 GMT',
'Server': 'nginx',
'Transfer-Encoding': 'chunked'}
response.headers 对象的类型 是 继承自 Dict 字典 类型的一个 类。
我们也可以像操作字典一样操作它,比如取出一个元素的值
print(response.headers['Content-Type'])
检查响应消息体
获取响应的消息体的文本内容,直接通过response对象 的 text 属性即可获取
import requests
response = requests.get('http://mirrors.sohu.com/')
print(response.text)
但是有时候,服务端并不一定会在消息头中指定编码格式,这时, requests的推测可能有误,需要我们指定编码格式。
可以通过这样的方式指定
import requests
response = requests.get('http://mirrors.sohu.com/')
response.encoding='utf8'
print(response.text)
如果我们要直接获取消息体中的字节串内容,可以使用 content 属性,
比如
import requests
response = requests.get('http://mirrors.sohu.com/')
print(response.content)
当然,如果可以直接对 获取的字节串 bytes对象进行解码
print(response.content.decode('utf8'))
session机制
requests库给我们提供一个 Session 类 。通过这个类,无需我们操心, requests库自动帮我们保存服务端返回的 cookie数据, HTTP请求自动 在消息头中放入 cookie 数据。
import requests
# 打印HTTP响应消息的函数
def printResponse(response):
print('\n\n-------- HTTP response * begin -------')
print(response.status_code)
for k, v in response.headers.items():
print(f'{k}: {v}')
print('')
print(response.content.decode('utf8'))
print('-------- HTTP response * end -------\n\n')
# 创建 Session 对象
s = requests.Session()
# 通过 Session 对象 发送请求
response = s.post("http://127.0.0.1/api/mgr/signin",
data={
'username': 'byhy',
'password': '88888888'
})
printResponse(response)
# 通过 Session 对象 发送请求
response = s.get("http://127.0.0.1/api/mgr/customers",
params={
'action' : 'list_customer',
'pagesize' : 10,
'pagenum' : 1,
'keywords' : '',
})
printResponse(response)