JSON сообщений в микропифон - PullRequest
0 голосов
/ 30 ноября 2018

Я использую приведенный ниже код в Python на RPI, чтобы делать сообщения JSON

import requests
payload = '{"msg_type":"observation_payload","msg": 
{"serial":"FZtank","observations":{"8":{"d":0,"m":"JSON upload 
test","t":"1543540780"}}}}'
r = requests.post('https://my.website/api/observations', data = 
{'post_wrapper':payload})
print r.text

он производит

{"msg": {"remote_pi": "FZtank", "stored_ids": ["8"]}, "msg_type": "receipt"}

Я подумал, что это не будет слишком сложно сделать то же самоечто-то в микропионе на устройстве pycom

import urequests as requests
payload = '{"msg_type":"observation_payload","msg": 
{"serial":"FZtank","observations":{"8":{"d":0,"m":"JSON upload 
test","t":"1543540780"}}}}'
r = requests.post('https://my.website/api/observations', data = 
{"post_wrapper":payload})
print(r.text)
r.close()

, но оно дает

Traceback (most recent call last):
File "<stdin>", line 12, in <module>
File "/flash/lib/urequests.py", line 115, in post
File "/flash/lib/urequests.py", line 100, in request
File "/flash/lib/urequests.py", line 79, in request
TypeError: object with buffer protocol required

Сообщение типа TypeError означает, что ему нужна строка вместо словаря для данных

, поэтомуЯ пытался

import urequests as requests
payload = '{"post_wrapper":{"msg_type":"observation_payload","msg": 
{"serial":"FZtank","observations":{"8":{"d":0,"m":"JSON upload 
test","t":"1543540780"}}}}}'
r = requests.post('https://my.website/api/observations', data =payload)
print(r.text)
r.close()

, но это дает

{"msg": {"errorText": "Malformed POST - unable to decode JSON"}, "msg_type": 
"error"}

Так что теперь я в замешательстве.Неужели проблема в том, что веб-сайт ожидает, что словарь и микропайтон могут отправлять только строку?

.

Некоторые дополнительные детали: я использую https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py, но строка 52 изменена сai = usocket.getaddrinfo (хост, порт, 0, usocket.SOCK_STREAM) в ai = usocket.getaddrinfo (хост, порт), потому что он выдавал сообщение об ошибке около 4 аргументов против 2. Если я запускаю

import urequests as requests
payload = '{"post_wrapper":{"msg_type":"observation_payload","msg": 
{"serial":"FZtank","observations":{"8":{"d":0,"m":"JSON upload 
test","t":"1543540780"}}}}}'
r = requests.post('https://my.website/api/observations', data=payload)

или

import urequests as requests
payload = {"post_wrapper":{"msg_type":"observation_payload","msg": 
{"serial":"FZtank","observations":{"8":{"d":0,"m":"JSON upload 
test","t":"1543540780"}}}}}
r = requests.post('https://my.website/api/observations', json=payload)

или

import urequests as requests
payload = {"msg_type":"observation_payload","msg": 
{"serial":"FZtank","observations":{"8":{"d":0,"m":"JSON upload 
test","t":"1543540780"}}}}
r = requests.post('https://my.website/api/observations', json= 
{"post_wrapper":payload})

Я получаю тот же результат

{"msg": {"errorText": "Malformed POST - unable to decode JSON"}, "msg_type": 
"error"}
...