Requests,post请求参数 json&data


问题:在学习requests中,对公司的程序进行登录测试,但是一直失败。对比抓包发送的数据,发现同自己写的发送的参数格式是不一样的。

 

 

上图为抓包的数据

 

 

 上图为自己写的登录脚本,发送的数据

  可以看到自己写的脚本request.body的内容则为a=1&b=2的这种形式,而抓包的request.body的内容则为'{"a": 1, "b": 2}'的这种形式

  百度后才知道post请求报文中既可以传data,也可以传json。并且data与json,既可以是str类型,也可以是dict类型。

一、Json

1.使用json参数,不管报文是str类型,还是dict类型如果不指定headers中content-type的类型,默认是:application/json。

二、DATA

1.使用data参数,报文是dict类型,如果不指定headers中content-type的类型,默认application/x-www-form-urlencoded,相当于普通form表单提交的形式,会将表单内的数据转换成键值对,此时数据可以从request.POST里面获取,而request.body的内容则为a=1&b=2的这种键值对形式。

注意:即使指定content-type=application/json,request.body的值也是类似于a=1&b=2,所以并不能用json.loads(request.body.decode())得到想要的值。

2. 使用data参数,报文是str类型,如果不指定headers中content-type的类型,默认application/json。
 
所以:
用data参数提交数据时,request.body的内容则为a=1&b=2的这种形式,
用json参数提交数据时,request.body的内容则为'{"a": 1, "b": 2}'的这种形式
 
先展示第一次自己写的脚本,这个时候发送的内容是 phone=123456&password=123456&remember=true
 1 import requests
 2 
 3 Data = {"phone":"123456",
 4         "password":"123456",
 5         "remember":"true"}
 6 
 7 url_login = "http://192.168.1.108:8082/api/login"
 8 
 9 print(Data)
10 
11 r = requests.post(url_login, data=Data)
12 print(r.text)

 

这里只需要修改requests的参数请求类型

r = requests.post(url_login, json=Data)

修改之后发送的请求内容就和抓包的数据时一样的了 {"phone": "123456", "password": "123456", "remember": "true"}

实现了正常登陆

 1 import requests
 2 
 3 Data = {"phone":"123456",
 4         "password":"123456",
 5         "remember":"true"}
 6 
 7 url_login = "http://192.168.1.108:8082/api/login"
 8 
 9 print(Data)
10 
11 r = requests.post(url_login, json=Data)
12 print(r.text)

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM