Python requests.post()中data与json参数的区别及用法详解
本文详解Python requests库中post方法的data与json参数区别。data默认进行URL编码,Content-Type为application/x-www-form-urlencoded;json参数自动序列化字典并设置Content-Type为application/json。通过代码示例对比两种传参方式对请求头及数据格式的影响,帮助开发者正确选择参数。
json和dict
在Python中将字典(dict)类型转换为JSON格式数据,需要借助json库。
import json
<json> = json.dumps(<dict>)
<dict> = json.loads(<json>)需要注意的是:
Python语言中并不存在名为json的数据类型。通过json.dumps(<dict>)将字典转换后,最终得到的是一个字符串对象。在Python中,JSON格式的数据本质上就是一个字符串。
>>> j = json.dumps(<dict>)
>>> type(j)
<class 'str'>尽管JSON格式的数据在Python中以字符串形式存在,但通过str(<dict>)工厂函数得到的结果与json.dumps(<dict>)方法的结果并不相同。
>>> d = {'a': 1, 'b': 2}
>>> d_d = {"a": 1, "b": 2}
>>> string = str(d)
>>> string_d = str(d_d)
>>> js = json.dumps(d)
>>> js_d = json.dumps(d_d)
>>> string == string_d
True
>>> js = js_d
True
>>> string == js
False
>>> string
"{'a': 1, 'b': 2}"
>>> js
'{"a": 1, "b": 2}'可以看出string和js的区别在于引号
要作为json.loads(<str>)参数对象的字符串,除了需满足字典类型的格式外,所有字符串对象的键和值必须使用双引号。
requests.post()
在使用requests.post()发起POST请求时,传入报文数据的参数有两个选项:data和json。
对于常见的HTML表单提交,可以直接使用data参数,此时data的值应为Python中的字典类型。
在爬虫开发中,有时会遇到payload报文为JSON格式的情况,此时传入的报文对象也应当符合JSON格式要求。
这里提供两种方法进行报文提交:
import requests
import json
url = "http://example.com"
data = {
'a': 1,
'b': 2,
}
# 1
requests.post(url, data=json.dumps(data))
# 2-json参数会自动将字典类型的对象转换为json格式
requests.post(url, json=data)其它:
在requests.get()方法中,可以使用params参数来构建URL查询字符串。
请求返回的结果可能出现乱码,可以通过resp.encoding属性查看网页编码方式。在获取resp.text之前,可对resp.encoding赋值为'utf-8',这样再次获取的resp.text将使用指定的编码方式。
post请求中json和data的区别
在POST请求中,既可以使用data传递参数,也可以使用json传递参数。
这两种方式有什么区别?
如果参数为JSON数据,可以直接传入json参数。该参数会自动将字典编码,并将Content-Type头部设置为application/json。
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("https://httpbin.org/post", json=payload)
print(r.text)如果data传递的是字符串(例如通过json.dumps(payload)生成),则requests会对参数进行URL编码,此时Content-Type值为None。因此,当data传递字符串时,必须在header中显式指定Content-Type。
payload = {'key1': 'value1', 'key2': 'value2'}
headers={"Content-Type": "application/json"}
r = requests.post("https://httpbin.org/post", headers=headers,data=json.dumps(payload))
print(r.text)如果data传递的是字典、由元组组成的列表或值为列表的字典,则requests会对参数进行URL编码,Content-Type的值默认为application/x-www-form-urlencoded。
# 字典
payload1 = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("https://httpbin.org/post", data=payload1)
# 元组组成的列表
payload2 = [('key1', 'value1'), ('key1', 'value2')]
r = requests.post("https://httpbin.org/post", data=payload2)
# 列表作为值的字典
payload3 = {'key1': ['value1', 'value2']}
r = requests.post("https://httpbin.org/post", data=payload3)到此这篇关于Python requests.post()方法中data和json参数的使用方法的文章就介绍到这了,更多相关Python requests post 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









