serializar postasync net formurlencodedcontent example ejemplos consume body c# .net utf-8 character-encoding windows-runtime

c# - postasync - Obtener una respuesta UTF-8 con httpclient en las aplicaciones de la Tienda Windows



postasync httpclient c# (6)

Estoy construyendo una aplicación de Windows Store, pero estoy atascado en obtener una respuesta UTF-8 de una API.

Este es el código:

using (HttpClient client = new HttpClient()) { Uri url = new Uri(BaseUrl + "/me/lists"); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Add("Accept", "application/json"); HttpResponseMessage response = await client.SendRequestAsync(request); response.EnsureSuccessStatusCode(); string responseString = await response.Content.ReadAsStringAsync(); response.Dispose(); }

El reponseString siempre contiene caracteres extraños que deberían ser acentos como é , y traté de usar una secuencia, pero la API que encontré en algunos ejemplos no existe en Windows RT.

editar: código mejorado, el mismo problema


El HttpClient no le da mucha flexibilidad.

Puede utilizar una HttpWebRequest en HttpWebRequest lugar y obtener los bytes sin HttpWebResponse.GetResponseStream() de la respuesta usando HttpWebResponse.GetResponseStream() .


Todavía no puedo comentar, así que tendré que agregar mis pensamientos aquí.

Podría intentar usar _client.GetStringAsync(url) como @cremor sugerido, y establecer sus encabezados de autenticación usando la propiedad _client.DefaultRequestHeaders . Alternativamente, también podría intentar usar el método ReadAsByteArrayAsync en el objeto response.Content y usar System.Text.Encoding para decodificar ese conjunto de bytes a una cadena UTF-8.


Mi enfoque usando una extensión:

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.Web.Http; namespace yourfancyNamespace { public static class IHttpContentExtension { public static async Task<string> ReadAsStringUTF8Async(this IHttpContent content) { return await content.ReadAsStringAsync(Encoding.UTF8); } public static async Task<string> ReadAsStringAsync(this IHttpContent content, Encoding encoding) { using (TextReader reader = new StreamReader((await content.ReadAsInputStreamAsync()).AsStreamForRead(), encoding)) { return reader.ReadToEnd(); } } } }


En lugar de usar response.Content.ReadAsStringAsync() directamente, podría usar response.Content.ReadAsBufferAsync() apuntado por @Kiewic de la siguiente manera:

var buffer = await response.Content.ReadAsBufferAsync(); var byteArray = buffer.ToArray(); var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);

Esto está funcionando en mi caso y supongo que usar UTF8 debería resolver la mayoría de los problemas. Ahora ReadAsStringAsync por qué no hay forma de hacerlo usando ReadAsStringAsync :)


Me gusta el enfoque de El Marchewko de usar una extensión, pero el código no funcionó para mí. Esto hizo:

using System.IO; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace WannaSport.Data.Integration { public static class HttpContentExtension { public static async Task<string> ReadAsStringUTF8Async(this HttpContent content) { return await content.ReadAsStringAsync(Encoding.UTF8); } public static async Task<string> ReadAsStringAsync(this HttpContent content, Encoding encoding) { using (var reader = new StreamReader((await content.ReadAsStreamAsync()), encoding)) { return reader.ReadToEnd(); } } } }


Lo resolvió así:

using (HttpClient client = new HttpClient()) { using (HttpResponseMessage response = client.GetAsync(url).Result) { var byteArray = response.Content.ReadAsByteArrayAsync().Result; var result = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length); return result; } }