2012-06-13 16 views
6

Używam niektórych danych przy użyciu interfejsu API XML . Ten interfejs API zawsze oferuje dane jako UTF-8.Kodowanie za pomocą HttpClient w .NET 4.5

Podczas korzystania z klasy WebClient w celu wysłania zapytania, jestem w stanie ustawić kodowanie. Na przykład:

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

Ale co z klasą HttpClient?

HttpClient client = new HttpClient(); 

powinienem używać:

client.GetByteArrayAsync(url); 

... a potem konwertować bajtów z kodowania (UTF-8) na ciąg?

Czy istnieje sposób, aby bezpośrednio uzyskać zawartość jako ciąg znaków UTF-8?

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

A oto fragment odpowiedzi XML:

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

Odpowiedz

9

Powinieneś być w stanie wykorzystać GetStringAsync - Spodziewam kodowanie, które zostaną określone przez nagłówków w odpowiedzi HTTP. Jeśli serwer nie określa kodowania, powinieneś poprosić o naprawienie tego.

Alternatywnie, jeśli pobierasz dane XML, po prostu pobierz je jako tablicę bajtów i przeanalizuj bezpośrednio plik binarny - deklaracja XML powinna w każdym razie określać kodowanie dla danych innych niż UTF-8/UTF-16, więc " d argumentują, że w rzeczywistości jest mniej miejsca na błędy w ten sposób.

+0

Hi Jon. Thx za twoją odpowiedź. Znacznik kodowania zawsze zawiera odpowiedź. W przypadku FogBugz zdefiniowane jest zawsze UTF-8. Tutaj przykładem początku XML .... I powoływać się na ten z WebClient, tam nie było kodowanie szanowany od api, więc nie jestem pewien, aby zaufać ponownie na api bez udokumentowanej funkcji :-( Więc Pierwsze ByteArray (jak moje codeample powyżej) powinno być najbezpieczniejszym sposobem? –

+1

@BoasEnkler: Klient isn Kodowanie pochodzi z * body * - powinno być określone w * nagłówkach *, ale jak już powiedziałem, bezpieczniejszym sposobem jest pobranie go jako bajtów i przeanalizowanie go tylko z danych binarnych. 'MemoryStream' do owijania tablicy bajtów.) –

+0

ok, że to najlepsze rozwiązanie. Kris polecił również to samo hing :) –

3

Jeśli dobrze rozumiem, nie potrzebujesz ciągi znaków, potrzebujesz XML.

Więc zakładając, że dane nie jest zbyt duży, czytać tablicę bajtów z

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

następnie utworzyć strumień pamięci z tej tablicy, a następnie odczytać XML z tego strumienia, przykładowo:

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

Jeśli używasz innego API XML, można użyć

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

fajny pomysł. ale chciałbym również zrozumieć oczekiwane zachowanie w przypadku innych scenariuszy. –