Как заставить HttpClient.PostAsync работать так же, как пост от Почтальона? - PullRequest
0 голосов
/ 30 апреля 2019

Когда я пишу в свой API (написанный на ядре .NET и размещенный на Linux) из Postman, все работает как положено. Когда я делаю то же самое из кода (используя HttpClient), параметры не отправляются. Ниже мой код:

var content = new FormUrlEncodedContent(new []
{
    new KeyValuePair<string, string>(nameof(userName), userName),
    new KeyValuePair<string, string>(nameof(serialNumber), serialNumber)
});

var result = await _httpClient.PostAsync(_uri, content).ConfigureAwait(false);
var json = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
return JsonConvert.DeserializeObject<Response>(json);

По моему мнению, контент должен быть отправлен, и все должно быть в порядке. Я вижу значительные различия между звонками в Wireshark.

Рабочий пост от почтальона: Working POST from Postman POST от HttpClient, который не работает: POST from HttpClient that does not work .

Что я могу сделать, чтобы убедиться, что мой HttpClient.PostAsync отправляет данные правильно?

1 Ответ

2 голосов
/ 30 апреля 2019

Версия Почтальона не имеет тела, но имеет userName и serialNumber, закодированные в URL в качестве параметров запроса.

Чтобы добиться того же, используя HttpClient, вам нужно добавить эти параметры в URL.

var uriBuilder = new UriBuilder(_uri);

// If you already have query parameters, this code will preserve them. 
// Otherwise you can just create a new NameValueCollection instance.
var parameters = HttpUtility.ParseQueryString(uriBuilder.Query);
parameters[nameof(userName)] = userName;
parameters[nameof(serialNumber)] = serialNumber;

uriBuilder.Query = parameters.ToString();

// Pass null as HttpContent to make HttpClient send an empty body
var result = await _httpClient.PostAsync(uriBuilder.ToString(), null).ConfigureAwait(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...