一个http请求包括三个部分,分别为请求行,请求报头(请求头),消息主体(请求体),类似以下这样:
请求行
请求报头
消息主体
HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式。服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括
1. application/x-www-form-urlencoded
最常见post提交数据的方式,以form表单形式提交数据。
2. application/json
以json串提交数据。
3. multipart/form-data
一般使用来上传文件。
1. 以form形式发送post请求
Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data
参数即可。
# 获取小米有品的分类信息
headers = {
"Host": "youpin.mi.com",
"Content-Type": "application/x-www-form-urlencoded",
"Referer": "https://youpin.mi.com/", # 必须带这个参数,不然会报错
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36",
}
url = "https://youpin.mi.com/app/shopv3/pipe"
form_data = {"data": '{"result": {"model": "Homepage", "action": "BuildClass", "parameters": {"id": -6}}}'}
results = requests.post(url, data=form_data, headers=headers).text
print(results)
2. 以json形式发送post请求
可以将一json串传给requests.post()的data参数,
# http://jinbao.pinduoduo.com/index?page=1里面的分类,
import requests
import json
headers = {
"Content-Type": "application/json; charset=UTF-8",
"Referer": "http://jinbao.pinduoduo.com/index?page=5",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36",
}
url = "http://jinbao.pinduoduo.com/network/api/common/goodsList"
pyload = {"keyword": "", "sortType": 0, "withCoupon": 0, "categoryId": 16, "pageNumber": 1, "pageSize": 60}
response = requests.post(url, data=json.dumps(pyload), headers=headers).text
print(response
3. 以multipart形式发送post请求
Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files
参数即可。
url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print(r.text)
输出:
{
“args”: {},
“data”: “”,
“files”: {
“file”: “Hello world!”
},
“form”: {},
“headers”: {……
“Content-Type”: “multipart/form-data; boundary=467e443f4c3d403c8559e2ebd009bf4a”,
……
},
“json”: null,
……
}