Python 3.x 复制curl命令python 3 urllib请求API

Python 3.x 复制curl命令python 3 urllib请求API,python-3.x,curl,httprequest,Python 3.x,Curl,Httprequest,这个问题有点让我发疯。 我正在做一个非常简单的Python3脚本来管理公共网站中的API。 我能用curl做,但不能用pyhton。 无法在真实环境中使用请求库或curl,仅用于测试 这是有效的: curl -d "credential_0=XXXX&credential_1=XXXXXX" -c cookiefile.txt https://XXXXXXXXXXXXXXX/LOGIN curl -d 'json={"devices" : ["00:1A:1E:29:73:B2","0

这个问题有点让我发疯。 我正在做一个非常简单的Python3脚本来管理公共网站中的API。 我能用curl做,但不能用pyhton。 无法在真实环境中使用请求库或curl,仅用于测试

这是有效的:

curl -d "credential_0=XXXX&credential_1=XXXXXX" -c cookiefile.txt https://XXXXXXXXXXXXXXX/LOGIN

curl -d 'json={"devices" : ["00:1A:1E:29:73:B2","00:1A:1E:29:73:B2"]}' -b cookiefile.txt -v https://XXXXXXXXX/api-path --trace-ascii /dev/stdout
我们可以在curl调试中看到这一点:

发送头,298字节(0x12a)

0000:POST/api路径HTTP/1.1

0034:主机:XXXXXXXXXXXXXX

0056:用户代理:curl/7.47.0

006f:接受:/

007c:Cookie:csrf_令牌=751b6bd9-0290-496b-820e-XXXXXXXX;一场 00bc:=XXXXXX-6d29-4cf9-8907-XXXXXXXXXX

00e3:内容长度:60

00f7:内容类型:应用程序/x-www-form-urlencoded

0128: =>发送数据,60字节(0x3c)

0000:json={“设备”:[“00:1A:1E:29:73:B2”,“00:1A:1E:29:73:B2”] ==信息:上传已完全发送:60个字节中有60个

这是复制第二个请求的python代码,这是有问题的请求

string_query={"devices" : [ "34:FC:B9:CE:14:7E","00:1A:1E:29:73:B2" ]}
jsonbody_url=urllib.parse.urlencode(string_query)
jsonbody_url=jsonbody_url.encode("utf-8")

req=urllib.request.Request(url,data=jsonbody_url,headers={"Cookie" : 
cookie,"Content-Type": "application/x-www-form-urlencoded","User-
Agent":"curl/7.47.0","charset":"UTF-8","Content-
length":len(jsonbody_url),
"Connection": "Keep-Alive"},method='POST')
服务器完全忽略了Json内容。 其他一切都在工作,登录和来自同一API的其他url参数

有什么想法吗?

试试这个:

import requests

string_query={"devices" : [ "34:FC:B9:CE:14:7E","00:1A:1E:29:73:B2" ]}
headers={
  "Cookie" : cookie,
  "Content-Type": "application/x-www-form-urlencoded",
  "User-Agent":"curl/7.47.0",
  "charset":"UTF-8",
  "Connection": "Keep-Alive"
}
response = requests.post(url,data=string_query,headers=headers)
print(response.content)
试试这个:

import requests

string_query={"devices" : [ "34:FC:B9:CE:14:7E","00:1A:1E:29:73:B2" ]}
headers={
  "Cookie" : cookie,
  "Content-Type": "application/x-www-form-urlencoded",
  "User-Agent":"curl/7.47.0",
  "charset":"UTF-8",
  "Connection": "Keep-Alive"
}
response = requests.post(url,data=string_query,headers=headers)
print(response.content)

您好,我已经尝试了请求模块,只是为了从服务器获得响应(正如我说的,我不能在工作环境中使用它),但是运气不好。服务器正在忽略json输入。我开始认为服务器API有问题。谢谢您只能使用urllib?如果您可以提供文档或API的端点,它可能有另一个解决方案。是的,只有urllib。我想API文档不是很有用。我打开了一个要支持的案例,他们的最后一个回复是:“您需要使用表单数据,而不是JSON负载。”我发现解决方案可能是复制实际工作的curl请求,这就是我发布curl调试的原因。关于这一点,我确实有过这样的想法,因为您的cURL调试正在显示,但是我忽略了它,忽略了您提供的cURL命令中的-d选项。我想您可能需要进行会话来访问资源。您好,您已经尝试了请求模块,只是为了从服务器获得响应(正如我所说的,我无法在工作环境中使用它),但运气不好。服务器正在忽略json输入。我开始认为服务器API有问题。谢谢您只能使用urllib?如果您可以提供文档或API的端点,它可能有另一个解决方案。是的,只有urllib。我想API文档不是很有用。我打开了一个要支持的案例,他们的最后一个回复是:“您需要使用表单数据,而不是JSON负载。”我发现解决方案可能是复制实际工作的curl请求,这就是我发布curl调试的原因。关于这一点,我确实有过这样的想法,因为您的cURL调试正在显示,但是我忽略了它,忽略了您提供的cURL命令中的-d选项。我想你可能需要做一个会话来访问资源。