002、 requests.post() 用 data 还是 json 参数 ?
参考资料:https://www.cnblogs.com/yoyoketang/p/7231384.html
https://blog.csdn.net/liudinglong1989/article/details/104604626
一、requests.post() 用 data 还是 json参数 ??
概述:
1、首先要用浏览器 F12 功能,确认本次请求头Content-Type 默认值 是 application/x-www-form-urlencoded 还是 application/json ;
2、如果是 application/x-www-form-urlencoded, r = requests.post(url, data=字典 ) 是成功的 ;
3、如果是 application/json :
a、r = requests.post(url, data=json.dumps(字典)) ;——是成功的;(如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。)
b、r = requests.post(url, json=字典) ;——是成功的;关键字参数json的功能:会自动把字典转换成string;
加深理解的截图:
网友总结如下:
1、json后面只能赋值是字典类型的
2、data后面能赋值字典类型(不传headers)
3、data后面能赋值json类型的(需要headers是"Content-Type": "application/json;charset=UTF-8")
对于requests的post请求参数有data,json,这两种的区别是如果不指定headers,
json默认headers是application/json,data默认是表单提交headers是application/x-www-form-urlencoded
演示代码如下:
# -*- coding: utf-8 -*- import json import requests # 接口地址 login_url = "https://openapiv5.ketangpai.com/UserApi/login" # 请求头 json_headers = {"Content-Type": "application/json; charset=UTF-8"} form_headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"} # 请求数据,密码请自己注册。 data_dict = { "email": "153****6232", "password": "nmb153****6232", "remember": "0" } print('\n============= 第一种情况 ==============\n') # 第一种情况:Content-Type 没有设置,用data传字典 resp = requests.post(login_url, data=data_dict) # 请求成功 print(resp.request.headers) # 'Content-Type': 'application/x-www-form-urlencoded' print(resp.json()) print('\n============= 第二种情况 ==============\n') # 第二种情况:Content-Type 没有设置,用json传字典 resp = requests.post(login_url, json=data_dict) # 请求成功 print(resp.request.headers) # 'Content-Type': 'application/json' print(resp.json()) print('\n============= 第三种情况 ==============\n') # 第三种情况:设置请求头 'Content-Type': 'application/json',用data传字典 resp = requests.post(login_url, data=data_dict, headers=json_headers) # 请求失败, 如果改成:json=data_dict 或者 data=json.dumps(data_dict) ,请求成功。 print(resp.request.headers) # 'Content-Type': 'application/json; charset=UTF-8' print(resp.json()) print('\n============= 第四种情况 ==============\n') # 第四种情况:设置请求头 'Content-Type': 'application/x-www-form-urlencoded',用json传字典 resp = requests.post(login_url, json=data_dict, headers=form_headers) # 请求成功; 如果改成:data=data_dict,请求成功。 print(resp.request.headers) # 'Content-Type': 'application/x-www-form-urlencoded print(resp.json())
执行结果如下:
D:\SkyWorkSpace\WorkSpace\API_test\lm\ch_04\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/API_test/lm/ch_04/demo_1.py ============= 第一种情况 ============== {'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '52', 'Content-Type': 'application/x-www-form-urlencoded'} {'status': 1, 'code': 10000, 'message': '访问成功', 'data': {'url': '', 'token': 'ee32283b71dfd6e5995281754fe82544a095a95de865f17ee354e1491176af70', 'isenterprise': 0, 'uid': 'MDAwMDAwMDAwMLSsudyHqb9qhMtyoQ'}} ============= 第二种情况 ============== {'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '71', 'Content-Type': 'application/json'} {'status': 1, 'code': 10000, 'message': '访问成功', 'data': {'url': '', 'token': 'ee32283b71dfd6e5995281754fe82544a095a95de865f17ee354e1491176af70', 'isenterprise': 0, 'uid': 'MDAwMDAwMDAwMLSsudyHqb9qhMtyoQ'}} ============= 第三种情况 ============== {'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json; charset=UTF-8', 'Content-Length': '52'} {'status': 0, 'code': 30501, 'message': '用户名不能为空', 'data': {}} ============= 第四种情况 ============== {'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Content-Length': '71'} {'status': 1, 'code': 10000, 'message': '访问成功', 'data': {'url': '', 'token': 'ee32283b71dfd6e5995281754fe82544a095a95de865f17ee354e1491176af70', 'isenterprise': 0, 'uid': 'MDAwMDAwMDAwMLSsudyHqb9qhMtyoQ'}} Process finished with exit code 0