关于Python的post请求报504错误
这是个奇葩的问题,我也是奇葩的研究了好几天,最后发现,哈,原来是这个原因,在此记录下曲折的心路历程
接口Content-Type没有,body用的是postman中的raw数据,格式是text
程序如下:
import requests
url = "https://XXXXXX.com/api/user_device" headers = {
'UserName': 'XXX1121@1.com',
'AccessToken': '08CXXXXXXXt051aS0o*evCgA'
,'AppVersion': 'XXX4.3.3',
'PhoneOS':'iPhone X',
'PhoneModel':'IOS 11.1',
'PhoneID':'phoneIdUniqueId',
'PhoneLanguage':'en'} data = {"LastConnectTime": 1623876540,
"mDeviceId": "123456a",
"FwVer": "YedUn1TJBu2yVbOkWaKQiQNmijxrM7S9",
"HwVer": "4FUNuI7BE4z5jJGWt598hZeYv0qKOqDy",
"DeviceType": "XX5"} r = requests.post(url, headers=headers, data=data)
print(type(data)) print(r.status_code)
#print(r.json())
1.开始是因为有一个报错,大概是SSLverify fail 的一个错,然后我就各种找原因,最后的解决方式是在requests.post里面加一个参数verify=False;这样报错就变成了一个警告,然后程序运行报504;这是麻烦的开始!
心路:我开始以为是SSL的那个警告引起的错误504,然后就各种查,后来发现好像不对,然后就研究是不是body格式引起的问题
2.然各种查body格式和Content-Type格式,真的是有收获,Content-Tpye有4种格式:application/x-www-form-urlencoded;multipart/form-data;application/json;text/xml;前三种格式需要在header里加上Content-Type类型,最后一种不需要;raw属于最后一种,且用的是text格式,所以我就在headers里加
'Content-Type':'text/xml'
结果:不再报504.接口跑通了,但是API报了个参数错误
心路:协议里是没有Content-Type.可能不能乱加
注:试各种Content-Type的时候有的会报400
3.最后我把data处理了一下成功解决问题。data= json.dumps(data);然后在发送请求就可以了,Content-Type加不加都行(加上更好)。
总结:requests发送请求的data需要是str格式,而我写的是json格式,也就是Python里的dict,需要转换才能用,但是如果只看报错,根本不知道是什么原因
成功的程序:
import requests
import json url = "https://XXXXX.com/proapi/user_device" headers = {'Content-Type':'text/xml',
'UserName': 'XXX1121@1.com',
'AccessToken': '08j*XXXXXKdt051aS0o*evCgA'
,'AppVersion': 'XXX4.3.3',
'PhoneOS':'iPhone X',
'PhoneModel':'IOS 11.1',
'PhoneID':'phoneIdUniqueId',
'PhoneLanguage':'en'} data = {"LastConnectTime": 1623876540,
"mDeviceId": "123456a",
"FwVer": "YedUn1TJBu2yVbOkWaKQiQNmijxrM7S9",
"HwVer": "4FUNuI7BE4z5jJGWt598hZeYv0qKOqDy",
"DeviceType": "XX5"} data=json.dumps(data)
r = requests.post(url, headers=headers, data=data) print(r.status_code)
#print(r.json())
小插曲:如果https报错(只要不是200),print(response.json)会报错:
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
注:Python的request会把没有给Content-Type类型的数据默认成application/x-www-form-urlencoded,但是我不知道为啥我这里没有出问题;设定 在 urllib.request.AbstractHTTPHandler.do_request_()这个文件里;如果不想要默认的设定可以把那几句注释掉
重大发现:
原来postman有一个功能把接口请求直接转换成程序,以后写程序出问题时,可以借鉴参考一下
关于Python的post请求报504错误的更多相关文章
- SpringMVC的AJAX请求报406错误
SpringMVC的AJAX请求报406错误原因有两种:1.jackson包没有引入 2.如果已经引入jackson包了还报406的错误,那么就有可能是请求的url路径是.html结尾,但是返回的数据 ...
- TP5 ajax请求报500错误
场景:几个站点从阿里云迁移到腾讯云,然后 TP5项目 ajax请求报500错误 数据返回成功,但是http状态码是500,不走success,一直走error 如下图: 原因分析: 服务器centos ...
- springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。
springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...
- Yii 1.1 请求报400错误
Yii的action可以带参数,比如: class PostController extends CController { public function actionCreate($categor ...
- ajax请求报语法错误
今天改代码修正完一个ajax请求后,调试发现出错进error方法,查看错误信息报语法错误,具体是调用parseJSON方法时出错,因为我是用json方式传递的参数,所以第一时间查看data参数是否正确 ...
- 【证书】curl 和 java 请求报证书错误
1. 说明: 以下:例子的域名因为工作环境的问题,被我拿自己的博客域名替代了,所以无法进行模拟测试,请珍重,哈哈! 2. 环境: centos:7.5 java jdk:1.8.0_74 3. cur ...
- 解决微信小程序用 SpringMVC 处理http post时请求报415错误
解决微信小程序用 SpringMVC 处理http post时请求返回415错误 写微信小程序时遇到的问题,这个坑硬是让我整了半天 wx.request请求跟ajax类似处理方法一致 小程序端请求代码 ...
- http请求报400错误的原因分析
在ajax请求后台数据时有时会报 HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里: 原因:1)前端提交数据的字段名称或者是字段类型 ...
- Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.
背景 在做接口自动化的时候,Excel作为数据驱动,里面存了中文,通过第三方库读取中文当请求参数传入 requests.post() 里面,就会报错 UnicodeEncodeError: 'lati ...
随机推荐
- JavaWeb(五):MVC案例
MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它把应用程序分成三个核心模块:模型.视图.控制器,它们各自处理自己的任务.模型是应用程序的主体部分 ...
- SQL笔试
一.题目 二.练习数据 SELECT VERSION(); create table CDM_AGENT(ano VARCHAR(6),aname VARCHAR(8)); create table ...
- 如何在pycharm中进入shell脚本调试代码
首先在Teramal终端 输入python manage.py shell 然后进行下图操作来调试代码
- Angular JS - 9 - SeaJS加载js模块
seajs加载模块的三种方式 1.seajs.use() 加载入口模块,类似于Java的main函数 2.require: 当在一个模块中需要用到其它模块时一般用require加载 1) ...
- 看图了解RocksDB
它是一个高性能的Key-Value数据库.设计了完善的持久化机制,同时保证性能和安全性.能够良好的支持范围查询,因为K-V记录就是按照Key来排序的. 下图为写入的流程: 可以看到主要的三个组成部 ...
- UVA 12012 Detection of Extraterrestrial(KMP求循环节)
题目描述 E.T. Inc. employs Maryanna as alien signal researcher. To identify possible alien signals and b ...
- tarjan-LCA模板
洛谷P3379 #include <cstdio> using namespace std; ; struct etype{ int t,next; }; struct qtype{ in ...
- English-such as, for example, include and contain
such as 后接动词,通常用动名词,有时也可用动词原形 for example 后接动词,用动名词 include vt. 包含,包括 后接动词,用动名词 英英: If one thing inc ...
- Linux对用户态的动态内存管理
Linux对内核态内存分配请求与用户态内存分配请求处理上分别对待 Linux本身信任自己,因此Linux内核请求分配多少内存,就会马上分配相同数量的内存出来. 但内核本身不相信应用程序,而且通常应用程 ...
- excel vlookup的使用
表1 姓名 部门 *** *** *** *** 表2 姓名 部门 *** *** *** *** *** *** *** *** 找表2的姓名对应部门,粘贴在表1中 vloo ...