2012-06-13 17 views
6

Sto consumando alcuni dati utilizzando l'API XML . Questa API offre sempre i dati come UTF-8.Codifica con HttpClient in .NET 4.5

Quando si utilizza la classe WebClient per effettuare una richiesta, sono in grado di impostare la codifica. Ad esempio:

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

Ma che dire della classe HttpClient?

HttpClient client = new HttpClient(); 

meglio utilizzare:

client.GetByteArrayAsync(url); 

... e poi convertire i byte dalla codifica (UTF-8) in una stringa?

Oppure c'è un modo per ottenere direttamente il contenuto come una stringa UTF-8?

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

Infine, ecco un estratto dalla risposta XML:

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

risposta

9

si dovrebbe essere in grado di utilizzare GetStringAsync - mi aspetto la codifica da stabilirsi da parte le intestazioni nella risposta HTTP. Se il server non specifica la codifica, dovresti potenzialmente chiedere che sia corretto.

In alternativa, se si stanno recuperando dati XML, è sufficiente recuperarli come array di byte e analizzare direttamente il binario - la dichiarazione XML deve specificare comunque la codifica per i dati non UTF-8/UTF-16, quindi I ' Supponiamo che in questo modo ci sia meno spazio per errori in questo modo.

+0

Hi Jon. Grazie per la tua risposta. Il tag di codifica è sempre incluso nella risposta. Nel caso FogBugz è definito essere sempre UTF-8. Ecco un esempio del principio del XML .... mi sono affidato a questo con WebClient, c'è la codifica non è stato rispettato dall'api, quindi non mi sento sicuro di fidarmi di nuovo sull'api senza la funzionalità documentata :-( Quindi ottenere il ByteArray (come il mio codice esempio sopra) dovrebbe essere il modo più sicuro? –

+1

@BoasEnkler: il client isn Prenderò la codifica dal * corpo * - dovrebbe essere specificato nelle * intestazioni *. Ma come ho detto, il modo più sicuro è di recuperarlo come byte e analizzarlo solo dai dati binari. un 'MemoryStream' per avvolgere l'array di byte.) –

+0

ok pensa che sia la soluzione migliore. hing :) –

3

Se ho capito bene, non hai bisogno di una stringa, hai bisogno di XML.

Quindi, supponendo che i dati non è troppo grande, leggere un array di byte con

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

quindi creare un flusso di memoria da tale matrice, e poi leggere XML da quella corrente, ad esempio:

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

Se stai usando un altro API XML, è possibile utilizzare

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

bella idea. ma mi piacerebbe anche capire il comportamento previsto per altri scenari. –

Problemi correlati