关于Python的post请求报504错误

摘要:
data=json.dumps;然后在发送请求就可以了,Content-Type加不加都行。

这是个奇葩的问题,我也是奇葩的研究了好几天,最后发现,哈,原来是这个原因,在此记录下曲折的心路历程

接口Content-Type没有,body用的是postman中的raw数据,格式是text

程序如下:

importrequests
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格式(曾经不懂,这里补充,json格式其实是符合标准的str,这里之所以报错是因为用的是dict,),也就是Python里的dict,需要转换才能用,但是如果只看报错,根本不知道是什么原因

成功的程序:

importrequests
importjson

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) fromNone
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错误》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++获取MAC与IP6410 声卡wm9713 驱动分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python使用multiprocessing创建多线程时异常的解决

一.linux   1.可能没有此模块,会抛出异常cannot import name Process,需要安装一下,在终端中使用pip install multiprocessing安装即可。   2.注意不要将文件明设置为multiprocessing.py 二.windows   1.注意不要将文件明设置为multiprocessing.py   2...

FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题

其实代码没有问题,但是我们忽略了一点,就是我们在正常的开发中,肯定是遇到这样的情况,我们频繁的有客户端链接,断开链接,我们需要统一的管理起来,那么我们应该如何去管理呢,其实这个时候,我们要去声明一个类去管理我们的这些链接。我们应该如何优化呢。 定义一个链接管理类,处理我们所有的链接。 classConnectionManager: def __in...

实践(1):简单的文件上传

文件上传 html、修改 <div class="template-upload"> <span>模版样式:</span> <button type="button" id="btn">选择模板</button> <input type="file" accept=".pptx,.ppt...

Python中的join函数用法

函数:string.join()Python中有join()和os.path.join()两个函数,具体作用如下:    join():    连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串    os.path.join():  将多个路径组合后返回一、函数说明1、join()函数语法:  'sep'.join(...

python--模块之基本

模块的概念: 在计算机程序开发过程中,随着程序代码越来越多,在一个文件里代码就会越来越长,不利于维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样每个文件包含的代码就相对较少。一个 .py文件就称为一个模块(module) 好处:大大提高了代码的可维护性;代码的重用性代码的保存性 模块种类:python标准库第三方模块应用程序自定义...

Python下使用virtualenv虚拟环境

前言 一般我们在写Python代码的时候,可能会同时开发几个项目,并且不同项目中使用到第三方库的版本也可能会不一致,这种情况下,我们最好就是能够使用 虚拟环境 来进行管理。 创建虚拟环境 使用virtualenv创建虚拟环境 virtualenv 是Python中用来创建虚拟环境的一个第三方库,可直接通过 pip 命令进行安装,命令如下:pip insta...