HTTP 415 Unsupported Media Type client при отправке данных на сервер - PullRequest
0 голосов
/ 13 февраля 2020

Это мой сервер не поддерживает этот запрос, или я отправляю некоторые неверные данные, которые, похоже, не соответствуют действительности.

# importing the requests library
import requests

# defining the api-endpoint
API_ENDPOINT = "http://10.176.14.170:5000/api/du/v1"

# data to be sent to api
data = {"name":"du1"}

# sending post request and saving response as response object
r = requests.post(url = API_ENDPOINT, data = data)

print(r)

Ответ:

<Response [415]>

Успех от веб-интерфейса командной строки, работающего на том же сервере.

post /api/du/v1

POST api/du/v1 {"name":"du1"}

Я также получаю успех, когда отправляю запрос POST с помощью команды curl с того же сервера

1 Ответ

0 голосов
/ 25 февраля 2020

Хотя исходная команда curl не была включена, хотя было указано, что данные были отправлены через POST на сервер как есть. Я собираюсь предположить, что curl -d '{"name":"du1"}' использовался вместе с соответствующими отправляемыми заголовками. Теперь, чтобы продемонстрировать это, используется следующая команда:

$ curl http://httpbin.org/post -d '{"name":"du1"}' -H 'Content-Type: application/json'
{
  "args": {}, 
  <b>"data": "{\"name\": \"du1\"}", </b>
  "files": {}, 
  <i>"form": {}, </i>
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "15", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.61.0"
  }, 
  <b>"json": {
    "name": "du1"
  }, </b>
  "url": "http://httpbin.org/post"
}

Обратите внимание на выделенный жирным ключом данных - это то, что, вероятно, читалось вашим приложением. Напротив, делая то же самое, что и с предоставленным использованием requests в той же конечной точке:

>>> import requests
>>> r = requests.post('http://httpbin.org/post', data={"name":"du1"})
>>> print(r.text)
{
  "args": {}, 
  <b>"data": "",</b>
  "files": {}, 
  <i>"form": {
    "name": "du1"
  }, </i>
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "8", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.21.0"
  }, 
  <b>"json": null, </b>
  "url": "http://httpbin.org/post"
}

Обратите внимание, как запросы были декодированы в форму просто потому, что a) представленные данные были необработанный словарь, а не строка с кодировкой JSON и б) заголовок не был предоставлен. Чтобы исправить это, просто закодируйте данные и предоставьте соответствующие заголовки:

>>> import requests
>>> import json
>>> data = json.dumps({"name":"du1"})
>>> r = requests.post(
...     'http://httpbin.org/post', data=data,
...     headers={'Content-Type': 'application/json'})
>>> print(r.text)
{
  "args": {}, 
  "data": "{\"name\": \"du1\"}", 
  "files": {}, 
  "form": {}, 
  ...
  "json": {
    "name": "du1"
  }, 
  ...
}

Обратите внимание, что сервер теперь может интерпретировать предоставленные данные и может декодировать их как JSON.

...