2012-06-13 12 views
6

में HttpClient के साथ एन्कोडिंग मैं XML API का उपयोग करके कुछ डेटा ले रहा हूं। यह एपीआई हमेशा यूटीएफ -8 के रूप में डेटा प्रदान करता है।.NET 4.5

अनुरोध करने के लिए WebClient कक्षा का उपयोग करते समय मैं एन्कोडिंग सेट करने में सक्षम हूं। उदाहरण के लिए:

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

लेकिन HttpClient कक्षा के बारे में क्या?

HttpClient client = new HttpClient(); 

मैं का उपयोग करना चाहिए:

client.GetByteArrayAsync(url); 

... और फिर एक स्ट्रिंग के लिए एन्कोडिंग (UTF-8) से बाइट्स कन्वर्ट?

या क्या यूटीएफ -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 प्रतिक्रिया से एक अंश है। यदि सर्वर एन्कोडिंग निर्दिष्ट नहीं करता है, तो आपको संभावित रूप से तय करने के लिए कहा जाना चाहिए।

वैकल्पिक रूप से, यदि आप एक्सएमएल डेटा ला रहे हैं, तो बस इसे बाइट सरणी के रूप में लाएं और सीधे बाइनरी पार्स करें - एक्सएमएल घोषणा को गैर-यूटीएफ -8/यूटीएफ -16 डेटा के लिए एन्कोडिंग निर्दिष्ट करना चाहिए, इसलिए मैं ' डी तर्क है कि वास्तव में इस तरह त्रुटि के लिए कम जगह है।

+0

हाय जॉन। आपके उत्तर के लिए Thx। एन्कोडिंग टैग हमेशा प्रतिक्रिया शामिल है। फोगबगज़ केस में इसे हमेशा यूटीएफ -8 माना जाता है। यहाँ एक्सएमएल के शुरुआत का एक उदाहरण .... मैं webclient के साथ इस पर भरोसा किया, वहाँ एन्कोडिंग नहीं था एपीआई से सम्मानित, इसलिए मुझे दस्तावेजी फीचर के बिना एपीआई पर दोबारा भरोसा नहीं करना पड़ेगा :-( तो बाइटएरे (जैसे मेरे कोड नमूने की तरह) प्राप्त करना सबसे सुरक्षित तरीका होना चाहिए? –

+1

@ बोसएन्क्लर: क्लाइंट isn * बॉडी * से एन्कोडिंग नहीं ले जायेगा - इसे * हेडर * में निर्दिष्ट किया जाना चाहिए। लेकिन जैसा कि मैंने कहा है, सुरक्षित तरीका इसे बाइट्स के रूप में लाने और बाइनरी डेटा से इसे पार्स करना है। (बनाएँ बाइट सरणी को लपेटने के लिए 'मेमोरीस्ट्रीम'।) –

+0

ठीक है लगता है कि यह सबसे अच्छा समाधान है। क्रिस ने भी उसी टी की सिफारिश की हिंग :) –

3

यदि मैं सही ढंग से समझता हूं, तो आपको स्ट्रिंग की आवश्यकता नहीं है, आपको XML की आवश्यकता है।

तो, अपने डेटा संभालने बहुत बड़ा नहीं है, तो उस सरणी से एक स्मृति स्ट्रीम बनाने

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

के साथ एक बाइट सरणी पढ़ा, और फिर उस धारा से एक्सएमएल पढ़ते हैं, उदाहरण के लिए:

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

यदि आप किसी अन्य XML API का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं

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

अच्छा विचार। लेकिन मैं अन्य परिदृश्यों के लिए अपेक्षित व्यवहार को भी समझना चाहता हूं। –

संबंधित मुद्दे