Python запрос свернуть запрос - PullRequest
0 голосов
/ 02 марта 2020

Пример python кода, который отправляет образец сообщения.

import requests

url = "dns.com/end"
msg = "test connection"
headers = {"Content-type": "application/json",
            "Authorization": "Basic asdfasdf"}

requests.post(url, json=msg, headers=headers)

Теперь я хотел бы отправить точно такое же сообщение с помощью запроса curl.

curl -X POST --data "test connection" -H '"Content-type": "application/json", "Authorization": "Basic asdfasdf"' dns.com/end

Я получено сообщение об ошибке: «status»: 404, «message»: «сообщение недоступно»

1 Ответ

1 голос
/ 02 марта 2020

У вас есть две проблемы:

  • Вы не отправляете JSON данные, вы забыли закодировать свои данные в JSON. Кодирование строкового значения test connection в JSON становится "test connection", но кавычки тоже имеют значение в вашей оболочке , поэтому вам нужно добавить extra цитирование или экранирование.
  • Вы не можете установить несколько заголовков для одной записи -H. Используйте несколько, по одному на каждый набор заголовков. Заголовки не нуждаются в кавычках, только оболочка нуждается в кавычках для предотвращения разделения аргументов на пробелы.

Это будет эквивалентно:

curl -X POST \
  --data '"test connection"' \
  -H 'Content-type: application/json' \
  -H 'Authorization: Basic asdfasdf' \
  dns.com/end

Демонстрация с использованием https://httpbin.org :

$ curl -X POST \
>   --data '"test connection"' \
>   -H 'Content-type: application/json' \
>   -H 'Authorization: Basic asdfasdf' \
>   https://httpbin.org/post

{
  "args": {},
  "data": "\"test connection\"",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Authorization": "Basic asdfasdf",
    "Content-Length": "17",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.54.0",
    "X-Amzn-Trace-Id": "Root=1-5e5c399c-201cc8007165873084d4cf38"
  },
  "json": "test connection",
  "origin": "<ip address>",
  "url": "https://httpbin.org/post"
}

, что соответствует Python эквиваленту:

>>> import requests
>>> url = 'https://httpbin.org/post'
>>> msg = "test connection"
>>> headers = {"Content-type": "application/json",
...             "Authorization": "Basic asdfasdf"}
>>> response = requests.post(url, json=msg, headers=headers)
>>> print(response.text)
{
  "args": {},
  "data": "\"test connection\"",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Authorization": "Basic asdfasdf",
    "Content-Length": "17",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.22.0",
    "X-Amzn-Trace-Id": "Root=1-5e5c3a25-50c9db19a78512606a42b6ec"
  },
  "json": "test connection",
  "origin": "<ip address>",
  "url": "https://httpbin.org/post"
}
...