У меня есть этот код, который используется для отправки сообщения на шлюз aws api.
payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, data=payload)
шлюз API возвращает: Метод завершен со статусом: 415
который для неизвестных СМИ
проблема началась, когда я обновил python с 2.7 до 3.6
код работал так:
payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, data=json.dumps(payload))
который работает нормально, но как только я обновился до 3.6, компилятор python начал выдавать мне эту ошибку:
TypeError: объект типа «байты» не является сериализуемым JSON
поэтому я должен изменить его на data=payload
, чтобы он прошел компилятор python, но тогда он не может пройти через шлюз API и возвращает известную медиа-ошибку со статусом 415.
поэтому есть два решения:
либо каким-то образом я нахожу способ отправить формат строковых данных JSON в python 3.6 вместо сериализуемого объекта dict JSON. чего я не мог.
каким-то образом сделать шлюз API, который служба aws может принимать сериализуемый объект dict JSON, отправляемый запросами python.post. который тоже не смог :(
любая помощь здесь.
Я пробовал это:
payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, json=payload)
он вернул этот трекбэк:
Traceback (most recent call last):
File "emon-device.py", line 154, in <module>
r = requests.post(api_gw, json=payload)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/api.py", line 116, in post
return request('post', url, data=data, json=json, **kwargs)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/api.py", line 60, in request
return session.request(method=method, url=url, **kwargs)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/sessions.py", line 519, in request
prep = self.prepare_request(req)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/sessions.py", line 462, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/models.py", l ine 316, in prepare
self.prepare_body(data, files, json)
File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/models.py", l ine 466, in prepare_body
body = complexjson.dumps(json)
File "/usr/lib64/python3.6/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'bytes' is not JSON serializable