2012-06-13 33 views
6

Bazı verileri XML API kullanarak tüketiyorum. Bu API daima veriyi UTF-8 olarak sunar..NET 4.5 HttpClient ile kodlama

İstekte bulunmak için WebClient sınıfını kullanırken kodlamayı ayarlayabiliyorum. Örneğin:

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

Peki ya HttpClient sınıfı nedir?

HttpClient client = new HttpClient(); 

kullanmam gerekiyor:

client.GetByteArrayAsync(url); 

... sonra bir dizeye kodlama (UTF-8) gelen bayt dönüştürmek?

Veya içeriği doğrudan UTF-8 dizesi olarak almanın bir yolu var mı? - Ben kodlama HTTP yanıtı başlıklar tarafından belirlenecek beklediğiniz

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

cevap

9

Sen GetStringAsync kullanmak gerekir:

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

Son olarak, burada XML yanıtından bir alıntıdır. Sunucu kodlamayı belirtmezse, potansiyel olarak bunun düzeltilmesini isteyebilirsiniz.

Alternatif olarak, XML verilerini getiriyorsanız, yalnızca bir bayt dizisi olarak getirin ve bu ikili dosyayı doğrudan çözümleyin - XML ​​bildirimi, UTF-8/UTF-16 verilerinin kodlamasını yine de belirtmelidir. d aslında bu şekilde hata için daha az yer olduğunu savunuyorlar.

+0

Merhaba Jon kullanabilirsiniz. Cevabınız için teşekkürler. Kodlama Etiketi her zaman yanıtı içerir. FogBugz Durumunda, her zaman UTF-8 olarak tanımlanmıştır. İşte XML başında bir örnek .... Ben webclient ile bu dayanıyordu, kodlama yoktu Api'den saygınlık duyduğum için, bu yüzden belgelenmiş özellik olmadan api'ye tekrar güvenmeme güveniyorum :-( Yani ByteArray'ı (yukarıdaki kodlarımın üstündeyim gibi) en güvenli yol olmalı? –

+1

@BoasEnkler: İstemci * Gövde * kodlamasını * kullanacağız - bu * başlıklarda belirtilmelidir * Ama dediğim gibi, daha güvenli bir yol, bayt olarak almak ve sadece ikili verilerden ayrıştırmaktır. byte dizisini sarmak için bir 'MemoryStream'.) –

+0

Tamam, en iyi çözüm olduğunu düşünüyorum. hing :) –

3

Doğru anlıyorsam, bir dizeye ihtiyacınız yok, XML'e ihtiyacınız var.

Yani, verilerinizi varsayarak çok büyük olmadığından, o diziden bir bellek akışı oluşturmak

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

ile bir bayt dizisi okuyun ve sonra örneğin bu akıştan XML okuyun:

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

Eğer başka bir XML API kullanarak ediyorsanız,

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

güzel bir fikir. ama diğer senaryolar için beklenen davranışları da anlamak isterim. –