Python requests.post()方法中data和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

常见的form表单可以直接使用data参数进行报文提交,而data的对象则是python中的字典类型;

在爬虫的过程中遇到了一种payload报文,是一种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),则request对参数进行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传递的是字典、元组组成的列表或列表作为值的字典,则request对参数进行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)

相关文章

文章浏览阅读2.4k次。最近要优化cesium里的热力图效果,浏览...
文章浏览阅读1.2w次,点赞3次,收藏19次。在 Python中读取 j...
文章浏览阅读1.4k次。首字母缩略词 API 代表应用程序编程接口...
文章浏览阅读802次,点赞10次,收藏10次。解决一个JSON反序列...
文章浏览阅读882次。Unity Json和Xml的序列化和反序列化_uni...