携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
requests.post概念
函数定义:def post(url, data=None, json=None, **kwargs),是requests模块中最常用的方法之一,毕竟在日常我们的工作或者学习中遇到的post接口还是在大多数。
参数解析
post方法的源码参数如下:
由上可知:
(1)url:用于传入目标服务器的接口链接
(2)data和json都是可选的传入目标服务器的入参
(3)而**kwargs是传入不定长的键值对,因为python的函数一般可拓展性都是比较强的,而requests.post中最终请求的其实requests.session().request,后续再对这个方法进行解读
post 请求通过json或者data传参,他们的区别是什么?
data传参:
1、dict字典类型的数据报文:默认情况下请求头:application/x-www-form-unlencoded,标识以form表单方式传参,格式:a=1&b=2&c=3
2、str类型数据报文:那么默认情况下:text/plain(如果是嵌套的字典格式需要转化成str格式传参,简单的字典格式可以不转str)
json传参:
1、不管是dict字典或者是str类型的 数据报文:默认请求头:application/json,请求数据格式默认是:{"a":"1","b":"2"}
实例
例子1、以多嵌套的请求参数请求,使用json方式传参
例子2、以多嵌套的请求参数请求,使用data方式传参,从返回的错误中可以得知,默认的请求头中是application/x-www-form-unlencoded
例子3:以str类型数据报文请求,通过json.dumps(data) ,将字典格式的数据转化成str格式,因接口只支持application/json,所以附加请求头。
例子4、嵌套json以dict类型,因接口只支持application/json,所以附加请求头。
抓包可以知道例子4的请求情况:
通过例子4的情况,为什么就算是请求头中传入了application/json,data在有些情况下还是不能够满足只支持json数据请求的接口?
1、原因是有嵌套的字典格式的数据无法转化成a=1&b=2&c=3,而传入请求头后,数据仍然没办法变成json格式数据。
2、转成str格式后,text/plain就能够正常支持传参,而将请求头改成application/json也能正常转换数据。
总结:
1、post请求时应用非常广泛的方式,在传送请求参数的时候需要根据请求接口的属性来指定入参形式,多重复杂的嵌套json串建议直接使用json=来入参
2、简单的键值对的dict和str格式则使用data=的方式进行传参