Отправка Json из Почтальона возвращает код 200, Отправка Json из HttpClient возвращает 503 (Ваши POST-данные слишком большие для загрузки) - PullRequest
1 голос
/ 27 марта 2020

Я делаю вызов API для ИБП, используя их проверку адресации (https://onlinetools.ups.com/rest/AV). У меня был успешный вызов различных приемов от UPS до этого (пример: проверка уровня адреса UPS).

Вот отправляемый json:

 {
    "AccessRequest": {
        "AccessLicenseNumber": "removed for security reasons",
        "UserId": "removed for security reasons",
        "Password": "removed for security reasons"
    },
    "AddressValidationRequest": {
        "Request": {
            "TransactionReference": {
                "CustomerContext": ""
            },
            "RequestAction": "AV"
        },
        "Address": {
            "City": "",
            "StateProvinceCode": "",
            "PostalCode": "98272"
        }
    }
}

В PostMan есть используются только заголовки по умолчанию: enter image description here

Возвращается успешно с данными, которые я ищу с кодом: 200.

В моем. Net Стандартная библиотека 2.0, я использую HTTPClient (Microsoft.As pNet .WebApi.Client 5.2.7) для вызова API. Вот как я запускаю HTTP-клиент (переменная с именем «ApiClient»):

string api = _config["UPS_API_LINK"];
_apiClient = new HttpClient();
_apiClient.BaseAddress = new Uri(api);
_apiClient.DefaultRequestHeaders.Accept.Clear();
_apiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

Теперь я создал модели для выравнивания, поэтому он отправляет точно такие же Json, как и Postman. С помощью приведенного ниже кода вы увидите, что я дважды проверяю это, выполняя сериализацию самостоятельно (я беру эту строку, копирую ее в почтальон и работаю как заклинание). Поэтому я отправляю свой запрос. Я немного сократил код, чтобы выразить свою точку зрения:

string json = JsonConvert.SerializeObject(request);
Debug.Print(json);
using (HttpResponseMessage response = await ApiClient.PostAsJsonAsync("/rest/AV", request))
{
    var content = await response.Content.ReadAsStringAsync();
}

Вот что возвращает содержимое:

<HTML><HEAD><TITLE>Weblogic Bridge Message</TITLE></HEAD> <BODY><H2>Failure of Web Server bridge:</H2><P><hr>Your chunked POST data is too large to upload.<hr> </BODY></HTML>

Код возврата - 503. Так что кто-то может привести меня в нужное место направление? Я просто не знаю, что отправляет HTTP-клиент, который делает его настолько большим, что я получаю этот ответ. Что меня удивляет, так это то, что у меня есть еще один вызов API, который отправляет больше данных, и он работает отлично. Будем благодарны за любые предложения.

Примечание: я дважды проверил, что я запрашиваю звонок, используя правильный URL enter image description here

Обновление: Благодаря Nehorai, я обнаружил, что могу использовать стороннюю dll-библиотеку RestSharp для выполнения вызовов Api. Эта библиотека работала без нареканий! Хотя я хотел бы знать, почему HTTP-клиент не работает в этой ситуации. Вот мой код ниже, используя RestSharp, если кто-то хотел его увидеть:

var client = new RestClient("https://onlinetools.ups.com/rest/AV");
client.Timeout = -1;
var requestRest = new RestRequest(Method.POST);
requestRest.AddHeader("Content-Type", "application/json");
requestRest.AddJsonBody(request);
var result = await client.ExecutePostAsync<ZipInfo_RootResponse>(requestRest);

1 Ответ

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

В почтальоне вы можете просмотреть фрагмент кода запроса, нажмите «Код»:

enter image description here

Затем вы можете выбрать язык, выберите C#, и вы увидите запрос в C# коде (вам нужно будет добавить ссылку на RestSharp dll)

...