python-requests中的json参数和data参数的区别

参考了这个这个

import requests
import json

def login():
url = ‘http://192.168.22.1:8090/login’
pdata = {"userName": "lidaxia","password":"loginpsd"}
res = requests.post(url,data = json.dumps(pdata))

在postman中,body使用json编码,可以发送成功,但是在python中一直因为请求体格式不对报错后经过百度,将代码改成以下:

import requests

def login():
url = ‘http://192.168.22.1:8090/login’
pdata = {"userName": "lidaxia","password":"loginpsd"}
res = requests.post(url,json = pdata)

看完官方文档, res = requests.post(url,data = dumps(pdata))和res = requests.post(url,json = pdata)的区别为,使用参数是json时会将请求中的Content-Type改成application/json,于是修改代码去验证: 

import requests
import json

def login():
url = ‘http://192.168.22.1:8090/login’
pdata = {"userName": "lidaxia","password":"loginpsd"}
headers = {"Content-Type":"application/json"}
res = requests.post(url,data = json.dumps(pdata),headers = headers)

也没有问题,所以,综上所述,如果post请求体是json格式的,使用json参数会更简单,推荐使用!




---------------------------------------------------------------------------------



通过requests.post进行POST请求时,传入的报文参数有两个,一个是data,一个是json,data和json既可以是str类型,也可以是dict类型。

区别:
1、不管json是str还是dict,如果不指定headers中的content-type,默认为application/json
2、data为dict时,如果不指定headers中的content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式
3、data为str时,如果不指定headers中的content-type,默认为application/text
4、json为dict时,如果不指定headers中的content-type,默认为application/json
5、json为str时,如果不指定headers中的content-type,默认为application/json
6、用data参数提交数据时,request.body的内容为a=1&b=2的这种形式;用json参数提交数据时,request.body的内容则是{"a":1, "b":2 }这种形式。

示例:
def index(request):
    print(request.body)
    #当以data为参数时,发过来的数据格式为: b'username=amy&password=123'
    #当以json为参数时,发过来的数据格式为: b'{"username": "amy", "password": "123"}'
    
    print(request.headers)
    #当以data为参数时,Content-Type为:application/x-www-form-urlencoded
    #当以json为参数时,Content-Type为:application/json