2012-06-13 25 views
6

Estoy consumiendo algunos datos usando la API XML . Esta API siempre ofrece datos como UTF-8.Codificación con HttpClient en .NET 4.5

Al utilizar la clase WebClient para realizar una solicitud, puedo establecer la codificación. Por ejemplo:

var result = new WebClient(); 
result.Encoding = Encoding.UTF8; 

¿Pero qué pasa con la clase HttpClient?

HttpClient client = new HttpClient(); 

¿Debo usar:

client.GetByteArrayAsync(url); 

... y luego convertir los bytes de la codificación (UTF-8) a una cadena?

¿O hay una manera de obtener directamente el contenido como una cadena UTF-8?

using (var client = Connector.GetHttpClient()) 
{ 
    var byteData = await client.GetByteArrayAsync(url); 
    data = Encoding.UTF8.GetString(byteData); 
} 

Por último, aquí es un extracto de la respuesta XML:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 

Respuesta

9

usted debería ser capaz de utilizar GetStringAsync - yo esperaría que la codificación sea determinada por las cabeceras de la respuesta HTTP. Si el servidor no especifica la codificación, entonces debería solicitar que se solucione.

Alternativamente, si está obteniendo datos XML, simplemente búsquelos como una matriz de bytes y analice directamente ese binario; la declaración XML debe especificar la codificación para datos que no sean UTF-8/UTF-16, así que ' D argumentan que en realidad hay menos margen de error de esta manera.

+0

Hola Jon. Thx por su respuesta. La etiqueta de codificación siempre incluye la respuesta. En el caso FogBugz, se define como UTF-8. Aquí un ejemplo de principio de la XML .... I se basó en esto con webclient, hay la codificación no era respetado de la API, así que no estoy seguro de volver a confiar en la API sin la característica documentada :-( Por lo tanto, obtener la matriz ByteArray (como mi codesample anterior) debe ser la más segura? –

+1

@BoasEnkler: El cliente no Tomará la codificación del * cuerpo * - debe especificarse en los * encabezados *. Pero como ya he dicho, la forma más segura es buscarla como bytes y analizarla solo a partir de los datos binarios. un 'MemoryStream' para envolver la matriz de bytes.) –

+0

ok, creo que esa es la mejor solución. Kris también recomendó la misma t hing :) –

3

Si entiendo correctamente, no necesita una cadena, necesita XML.

Así, suponiendo que sus datos no es demasiado grande, leer una matriz de bytes con

byte[] bytes = await client.GetByteArrayAsync(url); 

a continuación, crear una corriente de memoria de esa matriz, y luego leer XML a partir de esa corriente, por ejemplo:

XElement element = XElement.Load(new MemoryStream(bytes), LoadOptions.None); 

Si se está utilizando otro API XML, puede utilizar

XmlReader reader = XmlReader.Create(new MemoryStream(bytes)); 
+0

buena idea. pero también me gustaría entender el comportamiento esperado para otros escenarios. –

Cuestiones relacionadas