Member 14779968 Ответов: 1

Как преобразовать ответ в json с помощью httpwebresponse?


У меня есть свой метод SendRequest, который возвращает класс HttpWebResponse, я хочу получить ответ в виде Json, когда использую его в своем методе Get request. Как я могу этого достичь?

Вот мой метод sendrequest сценарию

private HttpWebResponse SendRequest(HttpWebRequest request, string queryParams, string token)
        {
            HttpWebResponse response = null;
            if(token != null)
            {
                request.Headers.Add("Authorization", "Bearer " + token);

            }

            request.ContentType = "application/json";

            try
            {
                
                response = (HttpWebResponse)request.GetResponse();
                
            }
            catch (WebException wex)
            {
                if (wex.Response == null)
                    throw new WebException(wex.StackTrace);

                using (var errorResponse = (HttpWebResponse)wex.Response)
                {
                    using (var reader = new StreamReader(errorResponse.GetResponseStream()))
                    {
                        throw new Exception(reader.ReadToEnd()); //expected error from JSON
                    }
                }
            }
            var responseVal = new StreamReader(stream: response.GetResponseStream()).ReadToEnd();

            return response;
        }



Вот вам способ

public HttpWebResponse IsGet(string baseURL, string basePath, string queryParams, string token)
       {
           var request = (HttpWebRequest)WebRequest.Create(baseURL+basePath+queryParams);
           request.Method = "GET";
          return SendRequest(request, queryParams, token);
       }



Вот мой метод тестирования

[Test]
public void GetUser()
{
    HttpWebResponse response  = client.IsGet(baseURL, "/User", null, token);
    //trying to get the Json response here....???

}


Что я уже пробовал:

Я попытался создать класс обработчика ответов, чтобы преобразовать его в Json, но получил ошибку
"Newtonsoft.Json.JsonReaderException : Ошибка чтения JToken из JsonReader. Путь ", строка 0, позиция 0"
трассировка стека:
JToken.ReadFrom(JsonReader reader, настройки JsonLoadSettings)
JToken.Parse(String json, JsonLoadSettings settings)
JToken.Parse(String json)


Вот класс обработчика запросов

public class ResponseHandler
   {
       public Stream unEncodedResponseStream;
       public StreamReader reader;
       public JContainer jsonResponseContainer;
       public HttpWebResponse responsePassedIn;
       public string responseAsJsonString;

       public Stream UnEncodeResponseStream()
       {
           // Unencode your response stream or, if it is not encoded, return it.
           var responseStream = responsePassedIn.GetResponseStream();
           if (responsePassedIn.ContentEncoding.ToLower().Contains("gzip"))
               unEncodedResponseStream = new GZipStream(responseStream, CompressionMode.Decompress);
           else if (responsePassedIn.ContentEncoding.ToLower().Contains("deflate"))
               unEncodedResponseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
           else
               unEncodedResponseStream = responseStream;

           return unEncodedResponseStream;
       }

       public string ConvertResponseStreamToString(HttpWebResponse webResponse)
       {
           // Unencode Response Stream.
           responsePassedIn = webResponse;
           var responseStream = UnEncodeResponseStream();

           // Convert the response to a JSON string.
           reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
           return reader.ReadToEnd();
       }

       public JContainer ConvertResponseToJson(HttpWebResponse response)
       {
           string localString;

           if (response.ContentEncoding.Contains("application/xml"))
           {
               // Convert the escaped Stream into an XML document.
               ConfigXmlDocument xmlDocument = new ConfigXmlDocument();
               xmlDocument.LoadXml(ConvertResponseStreamToString(response));

               // Now convert the properly-escaped JSON for the response into a JContainer
               localString = JsonConvert.SerializeXmlNode(xmlDocument);
           }
           else
               localString = ConvertResponseStreamToString(response);

           return JToken.Parse(localString) as JContainer;
       }
   }

1 Ответов

Рейтинг:
2

OriginalGriff

Данные, возвращаемые источником, могут быть не JSON - насколько это касается HttpWebResponse, это просто поток байтов, он включает в себя мало или вообще не включает в себя контекст.

Так что если Newtonsoft возвращает ошибку "Ошибка чтения JToken из JsonReader. Путь ", строка 0, позиция 0" затем вам нужно внимательно посмотреть, что именно он начал возвращать и обрабатывать.

Для этого можно использовать либо отладчик для просмотра его в реальном времени в коде, либо записать его в файл для автономного анализа.

Если он выглядит как JSON, то скормите его создателю класса, чтобы посмотреть, что он генерирует: Json2CSharp[^] это тот, который я использую.
Почти наверняка то, что вы предполагаете, что JSON-это вовсе не JSON, или он "упакован" таким образом, что вам нужно самостоятельно обработать возвращенные данные, прежде чем передавать их читателю JSON.

Но мы ничего не можем сделать для вас!