如何将HTTP请求转换为Python?

时间:2020-01-15 13:30:32

标签: python json http python-requests

我需要你的帮助。

我希望与REST API通信,该API包含端口号3上的传感器数据。 我有一个Json(POST)请求,可以在像Insomnia这样的REST客户端上完美执行。

我的请求:

{ "header": { "portNumber": 3 }, "data": { "index": 40 } }

Picture of my request

但是我无法使其在Python上运行,也无法从传感器中恢复数据。

我的Python代码:

import requests
import json

url = 'http://192.168.1.100/iolink/sickv1' # Address of the OctoPrint Server
header = {'portNumber': '3', 'Content-Type': 'application/json'} #Basic request's header
data = {'index': 40}


def get_sensor_measure():

r = requests.post(url + '/readPort', headers=header, data=data)

print(r.content)
print(r.status_code)

我得到了错误:

b'{"header":{"status":1,"message":"Parsing Failed"}}'

提前谢谢

3 个答案:

答案 0 :(得分:0)

您应该在'portNumber': '3'中传递data,而不是在header中传递

header = {'Content-Type': 'application/json'}
data = {'header': {'portNumber': '3'}, 'data': {'index': 40}}

而且正如documentation在他的回答中所述,您需要将data更改为json

r = requests.post(url + '/readPort', headers=header, json=data)

答案 1 :(得分:0)

我的猜测是您使用了错误的字段来传递有效负载。确实不是很明显,但是requests包期望JSON类型的有效负载与json字段一起发送,而不与data字段一起发送,即:

r = requests.post(url + '/readPort', headers=header, json=data)

答案 2 :(得分:0)

进行一些更改(粗体),它可以工作。谢谢

url = 'http://192.168.1.100/iolink/sickv1' # Address of the OctoPrint Server
    header = {'Content-Type': 'application/json'} #Basic request's header
    **data = {'header': {'portNumber': 3}, 'data': {'index': 40}}**

    def get_sensor_measure():

        r = requests.post(url + '/readPort', headers=header, json=data)

        print(r.content)
        print(r.status_code)