我有一个运行 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 请求。