Python3: JSON POST-запрос БЕЗ библиотеки requests
Я хочу отправить данные в формате JSON на сервер, используя только родные библиотеки Python. Я люблю библиотеку requests
, но не могу её использовать на машине, на которой выполняется скрипт. Необходимо сделать это без неё.
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 Error 500: Internal Server Error
Я на 100% уверен, что это НЕ проблема сервера, так как те же самые данные, с тем же URL, на той же машине и с тем же сервером работают с библиотекой requests
и в Postman.
В чём может быть проблема? Как я могу отправить эти данные корректно с использованием только стандартных библиотек Python?
1 ответ(ов)
Вы не отправляете JSON, вы отправляете запрос с типом application/x-www-form-urlencoded
.
Необходимо закодировать данные в формате JSON и установить правильные заголовки:
import json
import urllib.request
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"
}
Таким образом, вы отправите корректный JSON вместо url-кодированных параметров.
Почему Python не может разобрать эти данные JSON? [закрыто]
Как отправить JSON-данные с помощью Python Requests?
Возврат JSON-ответа из представления Flask
Ошибка JSONDecodeError: Ожидалось значение: строка 1, столбец 1 (символ 0)
Преобразование строки даты JSON в datetime в Python