关于Python的post请求报504错误

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

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

程序如下:

import requests
url = "https://XXXXXX.com/api/user_device"

headers = {
            ‘UserName‘: ‘[email protected]‘,
            ‘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‘: ‘[email protected]‘,
            ‘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有一个功能把接口请求直接转换成程序,以后写程序出问题时,可以借鉴参考一下

原文地址:https://www.cnblogs.com/mghhzAnne/p/9188306.html

时间: 2024-10-03 14:57:52

关于Python的post请求报504错误的相关文章

SpringMVC的AJAX请求报406错误

SpringMVC的AJAX请求报406错误原因有两种:1.jackson包没有引入 2.如果已经引入jackson包了还报406的错误,那么就有可能是请求的url路径是.html结尾,但是返回的数据是一个对象,这时浏览器就不知道怎么响应了,因为一般请求.html后缀的页面,返回的一般是个字符串或者页面内容,此时可以在web.xml中再配置一个拦截后缀,如*.action,web.xml可以有多个拦截后缀,请求.action的后缀,浏览器就没有这个限制了

ajax请求报语法错误

今天改代码修正完一个ajax请求后,调试发现出错进error方法,查看错误信息报语法错误,具体是调用parseJSON方法时出错,因为我是用json方式传递的参数,所以第一时间查看data参数是否正确,怎么看也没看出来data参数有问题,但是报的这个错误是客户端错误呀,这怎么搞?查别人遇到这种情况看到说最后还是服务器端的问题于是就试着调试一下服务器端代码,结果还真是..........因为一个地方验证了数据格式,如果不符合格式的我直接用Response.End(); 代码返回了,应该是ajax请

IE 浏览器在地址栏输入中文字符,发送get请求报400错误的问题

因为学校有JavaWeb的课程,所以才接触这方面.最近遇到了个小问题. 先看一段很简单的jsp代码例子 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <html> <head> <title>Hello.jsp</title> </head> <body> Welcome

Nginx反向代理报504超时错误

nginx+tomcat 后端为tomcat,nginx代理报504超时错误. 问题描述: #错误 1.198.17.123 - - [06/Jul/2018:01:48:57 +0000] "POST /mapbj3/getticket HTTP/1.1" 504 537 "https://XXXXXXXXXX.com/walkcode3/index.html?openId=oB6UW0cF3Z_dnYXnz4tG4OFt7Rt0" "Mozilla/5

个人504错误排查

个人504错误排查 一般出现500错误是由于php的语法错误引起的,权限的问题也有可能,laravel里面的storage和bootstrao/cache里面的权限没有修改就会500错误,其实都是php的语法问题,如果没有显示错误,可以尝试设 error_reporting(E_ALL)和ini_set('display_errors','on'); 一般的502错误,是有Bad Gate Way引起的.如果nginx 调用的是php_fpm.sock文件则需要nginx 需要对这个文件有读写的

关于php-fpm子进程达到上限并且浏览器访问显示504错误

今天上班遇到一个非常奇怪的事情,公司监控服务器之前都是在正常运行,使用nginx+php-fpm,并且监控服务器上部署这其他部门在使用的几个站点,从早上上班开始发现监控显示页面打不开,各种查找原因,最后发现只有在重启php-fpm后,监控页面才能正常访问,访问正常后,由于最近事情比较多,所以没太多关注.下午的时候我又打开看了下,发现又和上午一样,浏览器报504错误,并且重启php-fpm之后又能正常访问了:发现这个问题有点过分了,我想肯定起来不久又会重新报504错误的:过了两分钟,果然,继续访问

网站出现504错误

网站报504错误,起初以为是单点故障问题,后来经过一一排查,发现所有服务是好的,但是当我在一台nginx服务器上df -h的时候,发现以下问题: 这时候,我就想到了是不是nfs服务的问题,首先我查看了客户端和服务端的rpcbind是否起来,结果rpc服务是好的: 然后当我showmount的时候,出现以下报错: 这时候我就知道了,是服务端出了问题,并且使用ping,去ping一下服务端的内网IP,结果完全pin不同.那结果已经出来了,服务端网卡没有起来,或者防火墙开着 然后去服务端ifconfi

Nginx报504 gateway timeout错误的解决方法

转载文章来源:http://www.111cn.net/sys/nginx/90669.htm(若侵删) Nginx报504 gateway timeout错误引起,一个是文件配置问题,另一个是相关处理时长了,最后也有可能是资源不足导致了,下面我们一起来看看. 解释如下: 最近在工作中,需要做Excel导入的功能,由于Excel的数据比较多,而且我们的服务端程序需要对数据的内容做校验,会调用很多的外部服务接口,所以毫无悬念的导入Excel接口调用超过了一分钟,并且报错:504 gateway t

Python List数据打印后,更改List中的值报语法错误

number_list = [1,3,5,7,9] mix = ["python","12"] second_num = number_list[1] one_number = mix[0] print("one is {0} second is {1}".format(one_number, second_num) mix[1] = 100 print(mix) mix[1] = 100 报语法错误.如果注释掉打印语句则没有问题. ......