Content-Type常见的有x-www-form-urlencoded;charset=UTF-8和application/json两种,格式不对的话可能出错!:
x-www-form-urlencoded;charset=UTF-8
这种类型最为常见,在使用urllib库发送post请求时,往往这么操作:
from urllib import parse,request
#其实默认就是这种格式,这一句也可以不加
headers = {'Content-Type': 'x-www-form-urlencoded;charset=UTF-8'}
#构造需要post的数据
data={"name":"小明","password":"123456"}
#编码成urlencode格式
data = bytes(parse.urlencode(data),encoding='utf8')
#构造request
req =request.Request(url=url, headers=headers,data=data,method="POST")
#发起请求
response =request.urlopen(req)
在执行完data = bytes(parse.urlencode(data).encode(‘utf-8’)
后,data由原来的dict对象转成了bytes对象,而且内容变成了b'name=%E5%B0%8F%E6%98%8E&password=123456'
有没有很熟悉?我们地址栏常见这种东西,其实它就是将原来dict对象中的键值对,转化成了类似get方法的链接形式,并将其中的数据进行编码。也即post过去的就是这个bytes对象
对于requests:
import requests
#其实默认就是这种格式,这一句也可以不加
headers = {'Content-Type': 'x-www-form-urlencoded;charset=UTF-8'}
#需要post的数据
data={"name":"小明","password":"123456"}
#不需要编码,直接发请求
response=requests.post(url,headers=headers,data=data)
application/json
这种相对不常见,但应该是今后的主流,因为毕竟json才是未来嘛。
在使用urllib库发送post请求时,需要这么操作:
from urllib import parse,request
import json
#修改格式
headers = {'Content-Type': 'application/json'}
#构造需要post的数据
data={"name":"小明","password":"123456"}
#编码成json格式
data = bytes(json.dumps(data),encoding='utf8')
#构造request
req =request.Request(url=url, headers=headers,data=data,method="POST")
#发起请求
response =request.urlopen(req)
同样,在执行完data = bytes(json.dumps(data),encoding='utf8')
后,data由原来的dict对象转成了bytes对象,但内容和上面得不同,变成了b'{"name": "\\u5c0f\\u660e", "password": "123456"}'
,一眼就能看出,这就是json格式呀,只是中间的中文被编码了
对于requests:
import requests
#修改格式
headers = {'Content-Type': 'application/json'}
#构造需要post的数据
data={"name":"小明","password":"123456"}
#转成json格式
response=requests.post(url,headers=headers,data=json.dumps(data))
案例:
在调用6panAPI搭建自动提交离线任务的项目时,API要求的请求数据是json格式的,但我没有去修改请求头和数据,造成post请求过去之后,服务器以为我发了一个空请求,于是还给我一个{“success”:0},给我整蒙了,最后进了官方QQ群问了技术支持人员才知道
网友评论