构建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 = '''
<?xml version="1.0" encoding="UTF-8"?>
<WorkReport><Overall>良好</Overall><Progress>30%</Progress><Problems>暂无</Problems>
</WorkReport>
'''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,jsonpayload = {"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 requestsresponse = requests.get('http://mirrors.sohu.com/')
print(response.status_code)
检查响应消息头
要检查 HTTP 响应 的消息头,直接 通过 reponse对象的 headers 属性获取
import requests,pprintresponse = 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 requestsresponse = requests.get('http://mirrors.sohu.com/')
print(response.text)
但是有时候,服务端并不一定会在消息头中指定编码格式,这时, requests的推测可能有误,需要我们指定编码格式。
可以通过这样的方式指定
import requestsresponse = 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)