Я хочу отправить JSON-кодированные данные на сервер, используя только собственные библиотеки Python. Мне нравятся запросы, но я просто не могу использовать его, потому что я не могу использовать его на машине, которая запускает скрипт. Мне нужно это сделать.
newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} params = urllib.parse.urlencode(newConditions) params = params.encode('utf-8') req = urllib.request.Request(conditionsSetURL, data=params) urllib.request.urlopen(req)
Мой сервер – локальный Wamp-сервер. Я всегда получаю
urllib.error.HTTPError: ошибка HTTP 500: ошибка внутреннего сервера
Я на 100% уверен, что это НЕ проблема сервера, потому что одни и те же данные с одинаковым URL-адресом на одном компьютере с тем же сервером работают с библиотекой запросов. (Также работает с программой для отправки запросов POST). Я не могу понять, почему это так … Я сам кодировал API.
Вы не отправляете JSON, вы отправляете запрос application/x-www-form-urlencoded
.
Кодируйте в JSON и установите правильные заголовки:
import json newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} params = json.dumps(newConditions).encode('utf8') req = urllib.request.Request(conditionsSetURL, data=params, headers={'content-type': 'application/json'}) response = urllib.request.urlopen(req)
Демо-версия:
>>> import json >>> import urllib.request >>> conditionsSetURL = 'http://httpbin.org/post' >>> newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} >>> params = json.dumps(newConditions).encode('utf8') >>> req = urllib.request.Request(conditionsSetURL, data=params, ... headers={'content-type': 'application/json'}) >>> response = urllib.request.urlopen(req) >>> print(response.read().decode('utf8')) { "args": {}, "data": "{\"con4\": 40, \"con2\": 20, \"con1\": 40, \"password\": \"1234\", \"con3\": 99}", "files": {}, "form": {}, "headers": { "Accept-Encoding": "identity", "Connection": "close", "Content-Length": "68", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.4", "X-Request-Id": "411fbb7c-1aa0-457e-95f9-1af15b77c2d8" }, "json": { "con1": 40, "con2": 20, "con3": 99, "con4": 40, "password": "1234" }, "origin": "84.92.98.170", "url": "http://httpbin.org/post" }