2012-06-13 6 views
6

Ich nehme einige Daten mit der XML-API . Diese API bietet Daten immer als UTF-8 an.Kodierung mit HttpClient in. NET

Bei Verwendung der WebClient Klasse für eine Anfrage kann ich die Codierung einstellen. Zum Beispiel:

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

Aber was ist mit der Klasse HttpClient?

HttpClient client = new HttpClient(); 

Sollte ich:

client.GetByteArrayAsync(url); 

... und dann wandeln die Bytes aus der Codierung (UTF-8) in einen String?

Oder gibt es eine Möglichkeit, den Inhalt direkt als UTF-8-Zeichenfolge zu erhalten?

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

Schließlich ist hier ein Auszug aus der XML-Antwort:

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

Antwort

9

Sie sollten GetStringAsync der Lage sein, verwenden - ich würde erwarten, dass die Codierung durch die Header in der HTTP-Antwort bestimmt werden. Wenn der Server die Kodierung nicht angibt, sollten Sie möglicherweise darum bitten, dass dies behoben wird.

Alternativ, wenn Sie XML-Daten abrufen, holen Sie es einfach als Byte-Array und analysieren Sie diese Binärdatei direkt - die XML-Deklaration sollte die Codierung für Nicht-UTF-8/UTF-16-Daten sowieso angeben, also ' Ich argumentiere, dass es auf diese Weise tatsächlich weniger Spielraum für Fehler gibt.

+0

Hallo Jon verwenden. Danke für deine Antwort. Das Encoding-Tag ist immer die Antwort enthalten. Im FogBugz Case ist es immer UTF-8. Hier ein Beispiel für den Anfang des XML .... ich auf diesem mit webclient verlassen, gibt es bei der Kodierung Von der API respektiert, also bin ich nicht sicher, wieder auf der api ohne die dokumentierte Funktion zu vertrauen :-( So sollte das ByteArray (wie mein codesample oben) der sicherste Weg sein? –

+1

@BoasEnkler: Der Client isn Ich werde die Codierung aus dem * body * nehmen - sie sollte in den * headers * angegeben werden. Aber wie gesagt, der sicherere Weg besteht darin, sie als Bytes zu holen und sie nur aus den Binärdaten zu analysieren ein 'MemoryStream', um das Byte-Array zu umhüllen.) –

+0

ok denke, das ist die beste Lösung.Kris empfahl auch das gleiche t Hing :) –

3

Wenn ich richtig verstehe, brauchen Sie keine Zeichenfolge, Sie brauchen XML.

Also, Ihre Daten unter der Annahme, nicht zu groß ist, lesen Sie einen Byte-Array mit

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

dann von diesem Array einen Speicherstrom erzeugen, und dann XML-Daten aus diesem Strom lesen, zum Beispiel:

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

Wenn Sie eine andere XML-API verwenden, können Sie

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

nette Idee. aber ich möchte auch das erwartete Verhalten für andere Szenarien verstehen. –