Http Client правильный способ передачи контента во время post api call - PullRequest
4 голосов
/ 06 июня 2019

Ниже приведен фрагмент кода для вызова POST API, где я застрял с ошибкой:

Плохой запрос

После поиска в Интернете я понимаю, что вы получаете эту ошибкукогда вы не соблюдаете правильный синтаксис полезной нагрузки или передаете правильные данные полезной нагрузки во время вызова post api.

Вот несколько способов, которые я пробовал до сих пор, но, к сожалению, ни один из них не работает.

// payload data's class represantation,
    public class DNCAddressInfo
        {
            [JsonProperty("dncAddress")]
            public string DNCAddress { get; set; }
            [JsonProperty("checkForPhoneRejection")]
            public bool CheckForPhoneRejection { get; set; }
            [JsonProperty("checkForPhoneFormats")]
            public bool CheckForPhoneFormats { get; set; }
        }

Первая попытка:

DNCAddressInfo dncObj = GetPayloadData();
string payload = JsonConvert.SerializeObject(dncObj);
var content = new StringContent(payload, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.PostAsJsonAsync(url, content).ConfigureAwait(false); // response: error code: 400 , bad request

Вторая попытка:

    DNCAddressInfo dncObj = GetPayloadData();
JObject jsonObject = new JObject
            {
                ["dncAddress"] = JsonConvert.SerializeObject(dncObj.DNCAddress),
                ["checkForPhoneRejection"] = JsonConvert.SerializeObject(dncObj.CheckForPhoneRejection),
                ["checkForPhoneFormats"] = JsonConvert.SerializeObject(dncObj.CheckForPhoneFormats)
            };

 var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
 HttpResponseMessage response = await _client.PostAsJsonAsync(url, content).ConfigureAwait(false);// response: error code: 400 , bad request

Третья попытка:

string payload = "{\"dncAddress\": \"91#1231123\", \"checkForPhoneRejection\": false, \"checkForPhoneFormats\": false}"; // sample payload data taken from api providers document
var content = new StringContent(payload, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.PostAsJsonAsync(url, content).ConfigureAwait(false); // response: error code: 400 , bad request

Все три подхода привели к одной и той же ошибке,

StatusCode: 400, ReasonPhrase: '400'

Request header is , 
Headers = {Authorization: Basic XXXXX;
Accept: application/json
X-Requested-With: rest
Cache-Control: no-cache
}

Ответ от Почтальона выглядит все отлично.Вот снимок того же самого.

Postman response

Есть ли что-то, что я делаю здесь неправильно или что-то пропустил?

Ответы [ 2 ]

4 голосов
/ 06 июня 2019

С помощью метода PostJsonAsync вам не нужно вручную сериализовать объект в json, просто передайте его как есть:

DNCAddressInfo dncObj = GetPayloadData();
HttpResponseMessage response = await _client.PostAsJsonAsync(url, dncObj).ConfigureAwait(false);

или вы можете использовать более новую HttpClient.PostAsync:

DNCAddressInfo dncObj = GetPayloadData();
string payload = JsonConvert.SerializeObject(dncObj);
var content = new StringContent(payload, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.PostAsync(url, content).ConfigureAwait(false);

Ссылки: Метод HttpClient.PostAsync , Метод HttpClientExtensions.PostAsJsonAsync

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

Метод PostAsJsonAsync сериализует данные внутри.Когда вы передаете «StringContent» этому методу, HttpClient сериализует «StringContent» для Json и отправляет неверные данные.

Попробуйте использовать «PostAsync» вместо «PostAsJsonAsync».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...