2012-06-13 4 views
6

XML API를 사용하여 일부 데이터를 소비하고 있습니다. 이 API는 항상 데이터를 UTF-8로 제공합니다..NET 4.5에서 HttpClient로 인코딩하기

WebClient 클래스를 요청할 때 인코딩을 설정할 수 있습니다. 예 :

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

하지만 HttpClient 클래스는 무엇입니까?

HttpClient client = new HttpClient(); 

사용해야합니까 :

client.GetByteArrayAsync(url); 

... 다음은 문자열로 인코딩 (UTF-8)에서 바이트를 변환?

직접 콘텐츠를 UTF-8 문자열로 가져 오는 방법이 있습니까? - 내가 인코딩은 HTTP 응답의 헤더에 의해 결정되는 기대

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

답변

9

당신은 GetStringAsync을 사용할 수 있어야합니다 :

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

마지막으로, 여기에 XML 응답에서 발췌 한 것입니다. 서버가 인코딩을 지정하지 않으면 잠재적으로 인코딩을 요구해야합니다.

XML 데이터를 가져 오는 경우 바이트 배열로 가져 와서 직접 바이너리를 파싱하십시오. XML 선언은 어쨌든 비 UTF-8/UTF-16 데이터의 인코딩을 지정해야합니다. D는 실제로 이런 식으로 오류가 발생할 여지가 적다고 주장합니다.

+0

안녕 존을 사용할 수 있습니다. 귀하의 회신에 대한 Thx. 인코딩 태그는 항상 응답에 포함됩니다. FogBugz 케이스에서는 항상 UTF-8로 정의됩니다. 여기 는 XML의 시작의 예 .... 내가 웹 클라이언트와 본 의존 인코딩은 없었다 api를 존중하므로 문서화 된 기능이 없으면 api에서 다시 신뢰할 수 있다고 생각하지 않습니다 .-( ByteArray를 얻는 것이 가장 안전한 방법입니까? –

+1

@BoasEnkler : 클라이언트가 isn이 아닙니다. * body *에서 인코딩을 가져올 것입니다. * 헤더에서 지정해야합니다.하지만 앞서 말했듯이 안전한 방법은 바이트로 가져와 이진 데이터에서 파싱하는 것입니다. (Create 바이트 배열을 감싸는'MemoryStream'.) –

+0

ok는 가장 좋은 해결책이라고 생각합니다. Kris는 또한 똑같은 t hing : –

3

올바르게 이해하면 문자열이 필요하지 않으며 XML이 필요합니다.

따라서, 데이터를 가정하는 것은 너무 크지도 않고, 그 배열에서 메모리 스트림을 생성

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

와 바이트 배열을 읽은 다음 예를 들어, 그 스트림에서 XML을 읽어

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

다른 XML API를 사용하는 경우, 당신은

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

좋은 아이디어. 하지만 다른 시나리오의 예상 동작을 이해하고 싶습니다. –

관련 문제