python - post请求传参
基于自己踩过的坑,百度之后整理的,以备后期忘记之后,回忆回忆。
http协议规定post传输数据必须放在消息体里,但并未规定使用什么编码方式,常见的编码方式有四种:
1、application/x-www-form-urlencoded 浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
其传参方式为 key=value&key=value&key=value.. 也就意味着是以字符串形式传输
1 import requests
from urllib import parse 2 url='xxxx' 3 str = 'key={"k1": "v1","k2": "k2"}&k2=v2'
data = parse.quote(str, safe='=&') # safe 为不转码字符,此例子为 =和& 不做转码 4 headers = {'Content-Type': 'application/x-www-form-urlencoded'} #headers必须要传 5 response = requests.post(url, data=data, headers=headers) 6 print(response.text)
2、multipart/form-data 使用表单上传文件时,必须让 form 的 enctyped 等于这个值
其传参方式为 files = {'name': (<filename>, <file object>,<content type>, <per-part headers>)} 如果filename 和 content-Type不写,那么响应模拟post的数据就不会有二者。
1 data = { 2 'k1':(None, 'v1'), #filename设置为None 3 'k2':(None, 'v2') # 4 } 5 response = requests.post(url, files=data) #默认headers以multipart/form-data编码 6 print(response.text)
3、application/json 消息主体是序列化后的 JSON 字符串
其传参是标准的json格式,不做赘述
4、text/xml 是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范
尚未遇到,不做赘述