HTTP-запрос работает в Почтальоне, но не в коде C # - PullRequest
1 голос
/ 30 июня 2019

Я хочу сделать простой HTTP-запрос в C #, но что-то не работает, и все, что я получил, это 403 Forbidden код состояния.

Когда я пытаюсь сделать такой же запрос в Почтальоне, все работает нормально. Я попытался запустить Fiddler и посмотреть все заголовки, которые отправляет Почтальон. Я скопировал все из них, но все равно получил 403 Forbidden в запросе, отправленном кодом C #.

Код C # (с использованием https://flurl.dev):

public static void Main(string[] args)
{
    FlurlHttp.Configure(settings => {
        settings.HttpClientFactory = new MyClientFactory();
    });

    var url = "https://example.com"
        .AppendPathSegments(new[] { "v1", "oauth", "accesstoken" })
        .SetQueryParam("grant_type", "client_credentials")
        .AllowAnyHttpStatus()
        .WithBasicAuth("username", "password")
        .WithHeaders(new {
            User_Agent = "Something/0.4.0 Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G975F Build/NRD90M)",
            X_Secret_Header = "secret_encoded_value",
            accept_encoding = "gzip, deflate",
            Accept = "*/*"
        });

    HttpResponseMessage msg = url.GetAsync().Result;

    Console.WriteLine("StatusCodeString: " + msg.StatusCode.ToString());
    Console.WriteLine();
    Console.WriteLine(msg.Content.ReadAsStringAsync().Result);
}

class MyClientFactory : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler()
    {
        return new HttpClientHandler
        {
            AllowAutoRedirect = false
        };
    }
}

C # Запрос и ответ:

CSharp Request in Fiddler CSharp Response

Запрос и ответ почтальона:

Postman Headers Postman Response Postman Response in Fiddler

Может кто-нибудь объяснить мне, почему это не работает? Те же заголовки, все то же самое.

Я заменил URL-адрес на "example.com", потому что я не хочу показывать здесь настоящий URL-адрес API.

Также извините за такое количество изображений ... Я не знаю, как показать проблему здесь другим способом.

Ответы [ 3 ]

0 голосов
/ 30 июня 2019

Мое предложение будет извлекать необработанные строки запроса из приложения почтальона и C # и использовать что-то вроде https://text -compare.com / для поиска различий.Предполагается, что есть какая-то чрезвычайно незначительная разница, например, дополнительная косая черта, которую очень трудно заметить простым глазом.

0 голосов
/ 30 июня 2019

От Почтальона должна быть ссылка справа, называемая кодом.Нажмите на это и затем выберите C #, чтобы получить код, сгенерированный почтальоном.Вставьте это и попробуйте.

0 голосов
/ 30 июня 2019

Следующим шагом будет сравнение необработанных запросов и ответов из вашего кода C # и Почтальона, размещение их рядом и сравнение различий - уверяю вас, что будет хотя бы один. : -)

403 - это проблема авторизации , поэтому токен будет первым подозреваемым, поскольку неправильная структура вашего запроса с большей вероятностью вызовет 400 ошибку "Bad request".

В этом конкретном случае я запустил ваш код в VS2019 на своей машине с помощью Flurl, и он, кажется, работает нормально. Возвращает пример HTML-страницы:

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
...