Отправка POST-запроса

есть код

    def _call(self, method="GET", subdomain="api", path="/", headers=None, private=False, data=None, **params):
        url = "https://{0}.server.xx{1}".format(subdomain, path)
        print("url= " + url)
        print("subdomain= " + subdomain)
        if data:
            print("data= " + data)
        print("method= " + method)
        headers = headers or dict()
        headers.update({
            "Client-ID": self.CLIENT_ID1 if not private else self.CLIENT_ID2
        })

        return self.session.http.request(method, url, data=data, params=params, headers=headers)

на входе имеем:

url= https://gql.server.xx/gql
subdomain= gql
data= {"param1": "value1", "param2": "value2"}
method= POST

Нужно повторить этот запрос, например, в Postman’е. Как узнать, как выглядит отправляемая строка?
Когда пытаюсь повторить запрос в Postman’e, он выдаёт

{

    "errors": [

        {

            "message": "syntax error: unexpected \"\\\"operationName\\\"\", expecting Ident",

            "locations": [

                {

                    "line": 1,

                    "column": 8

                }

            ]

        }

    ],

    "extensions": {

        "durationMilliseconds": 1,

        "requestID": "01EW7Q8WMMFD9DRD842W5PTCYP"

    }

}

Как тогда у питона это получается? И как повторить этот запрос вне питона?

Какая? Вот же данные

только надо смотреть в каком формате отправить надо: JSON, urlencoded, …

В заголовках или каких-нибудь значениях по умолчанию session скорее всего есть про это.

print(headers)
print(self.session)

Или отладчиком зайти внутрь self.session.http.request и т.д.

Вообще можно просто посмотреть запросы например через

Заходил, смотрел. Там все параметры отдельно.

Он не перехватывает из питона

А сама строка-то как должна выглядеть?
server.com/gql?json... или как?
я всё уже перепробовал

Это куда именно? Если написать перед

                res = Session.request(self, method, url,
                                      headers=headers,
                                      params=params,
                                      timeout=timeout,
                                      proxies=proxies,
                                      *args, **kwargs)
                print(res)

То срабатывает экскепшен.

URL же вот

данные видимо в теле.

Надо просто прокси указать (порт в настройках фиддлера). И еще опцию про то, что не проверять сертификат (странно, обычно не надо, видимо тут Certificate Pinning).

streamlink --http-proxy http://127.0.0.1:8866 --http-no-ssl-verify

Ну и в настройках фиддлера понажимать кнопки про HTTPS и Trust.

ЗЫ фиддлер скатился, требует логиниться при запуске (

Теперь перехватывает. Он показывает те заголовки и JSON из стримлинка.
Но я всё-равно не понимаю, как именно отправляется сам запрос. Где это смотреть?

дык уже давно, вроде

Так вот же в Raw весь запрос: заголовки, тело.

image

И что? Как это повторить через Postman или curl? Там ошибки выдаются.
типа этой

"message": "syntax error: unexpected \"\\\"operationName\\\"\", expecting Ident",

Добавить все заголовки (то, что сверху), добавить тело (то, что внизу).
Для тела в постмане вроде можно выбрать raw и скопировать текст JSON.

image

вот он и ругается на первую кавычку и выдаёт эту ошибку.
убрал слово query. Теперь ругается

SSL Error: Unable to verify the first certificate

Disable SSL Verification <<кнопка

Learn more about troubleshooting API requests <<ссылка

нажал disable - запрос ушел и даже вернул правильный ответ

Не ругается.

image

Теперь я не понимаю, как сделать это программно. Я только что осознал, что впервые вижу запрос, содержащий тело, а не только заголовки. По-этому и туплю.
Создаём клиент и вешаем на него заголовки. А тело на него как повесить?

Зависит от библиотеки.

THTTPClient в Delphi
и
WebClient в C#

а делфи? У меня там уже готовая прога. Надо только запрос отправить и снова будет работать.
А на C# она только в зачатке.

System.Net.HttpClient.THTTPClient.Post - RAD Studio API Documentation

А тело куда? const ASource: TStrings; это тело? Не вижу там ни слова про тело.

Да.

To send the content of a string list, provide your instance of TStrings as ASource

Странно, что нельзя просто строку. Но видимо можно просто TStringList с одним элементом (или свойство Text установить).