Почему этот запрос работает с использованием HttpWebRequest, а не с RestSharp? - PullRequest
0 голосов
/ 30 октября 2019

Я использую API, который ожидает XML в запросе тела. Сначала я использовал API через Postman, и он работал, затем я использовал этот инструмент Postman, чтобы преобразовать запрос в код RestCharp C #, а затем, используя этот код, ответ, который я получал, был другим по сравнению с почтальоном. После этого я использовал Fiddler для генерации кода c # с запросом почтальона, и, используя этот код, сгенерированный fiddler, я смог успешно использовать API через код. Я просто пытаюсь понять, в чем разница между кодом, сгенерированным из почтальона, и кодом, сгенерированным из Fiddler.

Это код, сгенерированный из Fiddler, и он работает:

            HttpWebRequest request = 
            (HttpWebRequest)WebRequest.Create("http://x.x.x.x.x");

            request.Accept = "*/*";
            request.KeepAlive = true;

            request.Method = "POST";
            request.ServicePoint.Expect100Continue = false;

            byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body);
            request.ContentLength = postBytes.Length;
            Stream stream = request.GetRequestStream();
            stream.Write(postBytes, 0, postBytes.Length);
            stream.Close();
            response = (HttpWebResponse)request.GetResponse();

Это код, сгенерированный из Postman (слегка измененный, но, тем не менее, код, сгенерированный из Postman, не работал, и я не думаю, что внесенные изменения помешали результату) с использованием RestSharp, который не работает:

        var client = new RestClient("http://x.x.x.x.x");

        client.ConfigureWebRequest((r) =>
        {
           r.ServicePoint.Expect100Continue = false;
           r.KeepAlive = true;
        });

        var request = new RestRequest();

        request.AddXmlBody(body);
        IRestResponse response = client.Post(request);
        return response;

Я много чего пробовал в коде RestSharp, например, добавление заголовка с различными типами контента и кодировкой, например,

     request.AddHeader("Content-Type", "text/xml;charset=utf-8");

, но ничего не получалось. В ответе API, когда он используется кодом RestSharp, говорится, что он получил ошибку NPE, что, как я полагаю, означает NullPointerException, но, поскольку API работает нормально через почтальон и код, сгенерированный Fiddler, я не думаю, что проблеманаходится в API. Кстати, тело параметра в коде одинаково в обоих кодах.

1 Ответ

0 голосов
/ 30 октября 2019

Похоже, что тело запроса не соответствует ожидаемому типу контента по API. Если содержимое не соответствует типу содержимого, ожидаемому API, вы можете получить ошибку NPE.

в сгенерированном вами коде Fiddler вы отправляете строку XML в виде текста.

Пожалуйста, добавьте следующий код:

request.AddHeader("Content-Type", "text/plain");
request.AddParameter("undefined", "<YourXml></YourXml>", ParameterType.RequestBody);

или

request.AddHeader("Content-Type", "application/xml");
request.AddParameter("undefined", "<YourXml></YourXml>", ParameterType.RequestBody);

Вместо

request.AddXmlBody (body);

...