2017-02-16 21 views
0

Я разрабатываю стороннее приложение twitter. в то время как вы искали способ отправить веб-запрос, я нашел два класса: Windows.Web.Http.HttpClient и System.Net.Http.HttpClient.Windows.Web.Http.HttpClient и System.Net.Http.HttpClient получают разные ответы

Оба класса, похоже, не имеют большой разницы, но они получают очень разные результаты в одном запросе.

Когда я отправляю запросы с Windows.Web.Http.HttpClient, он работает хорошо.

public async Task<string> Request(Method method, string url, string postData) 
{ 
    var http = new Windows.Web.Http.HttpClient(); 
    Windows.Web.Http.HttpResponseMessage response; 

    if (method == Method.POST) 
    { 

     var httpContent = new Windows.Web.Http.HttpStringContent(postData, Windows.Storage.Streams.UnicodeEncoding.Utf8); 
     httpContent.Headers.ContentType = Windows.Web.Http.Headers.HttpMediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"); 
     response = await http.PostAsync(new Uri(url), httpContent); 
    } 
    else 
    { 
     response = await http.GetAsync(new Uri(url)); 
    } 

    return await response.Content.ReadAsStringAsync(); 
} 

Но если я посылаю запросы с System.Net.Http.HttpClient. Я получаю неправильный ответ.

(Но, когда я получить доступ к URL запроса с помощью веб-браузера, он хорошо работает не так, как изображение ниже)

public async Task<string> Request(Method method, string url, string postData) 
{ 
    var http = new System.Net.Http.HttpClient(); 
    System.Net.Http.HttpResponseMessage response; 

    if (method == Method.POST) 
    { 

     var httpContent = new System.Net.Http.StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); 
     response = await http.PostAsync(new Uri(url), httpContent); 
    }else 
    { 
     response = await http.GetAsync(new Uri(url)); 
    } 


    return await response.Content.ReadAsStringAsync(); 
} 

Почему этот другой? и как я могу решить эту проблему?

+1

Ответ на скриншот для System.Net.Http.HttpClient выглядит так, будто он может быть сжат (gzip), но HttpClient не распаковал его. Вы можете проверять заголовки как запроса, так и ответа, правильно ли отправляются/получаются HTTP-заголовки, такие как Accept-Encoding или Content-Encoding. Вы также можете проверить, правильно ли работает System.Net.Http.HttpClient, потому что поддержка для него [была добавлена ​​недавно в .NET Framework 4.6.2] (http://stackoverflow.com/a/38462037/1286670) –

+0

@ Нуф, ты прав! 'HttpClient' не распаковывал данные ответа. поэтому я написал код немного больше. – Mystika

ответ

0

Проблема была HttpClient не распаковывала данные gzip, поскольку Nuf сказал в комментариях.

поэтому я просто написал крошечный код для декомпрессии gzip.

public async Task<string> Request(Method method, string url, string postData) 
{ 
    var handler = new System.Net.Http.HttpClientHandler() 
    { 
     AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
    }; 
    var http = new System.Net.Http.HttpClient(handler); 
    System.Net.Http.HttpResponseMessage response; 
    if (method == Method.POST) 
    { 

     var httpContent = new System.Net.Http.StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); 
     response = await http.PostAsync(new Uri(url), httpContent); 
    } 
    else 
    { 
     response = await http.GetAsync(new Uri(url)); 
    } 


    return await response.Content.ReadAsStringAsync(); 
}