首页 > 编程问答 >Python 请求库无法成功完成 POST(Nanotec 电机控制器)

Python 请求库无法成功完成 POST(Nanotec 电机控制器)

时间:2024-07-21 15:50:11浏览次数:13  
标签:python python-requests

我有一个运行 REST Web 服务的电机控制器,我想使用 Python 对其进行控制。

我能够使用 Python 请求库成功执行 GET 请求。但是我无法执行 POST 请求。它给了我以下错误:

requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

我怀疑 Web 服务崩溃了,因为我有时必须重新启动电机控制器才能使 GET 请求再次工作。这是我用来执行 POST 的 python 代码:

import requests

url = 'http://192.168.178.199/od/607A/00'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = '00000002'

response = requests.post(url, headers=headers, data=data)

print(response.content)

不过,我能够使用以下 Curl 命令成功执行 POST 请求:

curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' -i 'http://192.168.178.199/od/607A/00' --data '"00000003"'

HTTP/1.0 200 OK
Server: uip/1.0
Cache-Control: no-cache, no-store, private
Content-type: application/json

python 代码应该完全相同,对吧?我缺少什么?

仅供参考:我使用的电机控制器是 nanotec n5-2-3。有关 REST 服务信息的手册可在此处找到: https://en.nanotec.com/fileadmin/files/Handbuecher/Handbuecher_Archiv/Steuerungen/N5/fir-v2039/N5_EtherNetIP_Technical-Manual_V3.2.0.pdf


问题在于,尽管文档中没有明确说明,但 Nanotec 控制器期望数据中的 JSON 字符串,而不是纯字符串。的 curl 命令之所以有效,是因为它隐式地在 --data 参数中传递了一个带引号的字符串,而的 Python 代码则传递了一个纯字符串。

要解决此问题,请将的 Python 代码修改为以下内容:

import requests

url = 'http://192.168.178.199/od/607A/00'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = '"00000002"'  # 将数据括在引号中以创建 JSON 字符串

response = requests.post(url, headers=headers, data=data)

print(response.content)

通过将 data 变量括在引号中,现在发送的是一个包含所需值的 JSON 字符串,就像的 curl 命令一样。这应该可以解决连接问题,并允许成功执行 POST 请求。

标签:python,python-requests
From: 75990729

相关文章