2012-02-24 9 views
16

मैं के माध्यम से एक RestSharp.RestRequest बना रहा हूं:क्या RestSharp मैन्युअल रूप से सामग्री-प्रकार सेट ओवरराइट करता है?

RestRequest request = new RestRequest(); 
request.Method = Method.POST; 
request.Resource = "/rest-uri"; 

request.AddHeader("Content-Type", "application/someContentType"); 

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + Environment.NewLine + 
      "<register-request">" + Environment.NewLine + 
      " <name=\"someName\"/>" + Environment.NewLine + 
      "</register-request>"); 

request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody); 

(सामग्री प्रकार मैन्युअल रूप से सेट किया गया है application/someContentType करने के लिए)

डिबग मोड में यह भी Content-Type=application/someContentType

से पता चलता लेकिन RestRequest क्रियान्वित 415 Media Not Supported देता है - त्रुटि और वायरशर्क दिखाता है कि मीडिया-प्रकार text/xml पर सेट है (जैसे AddParameter-Method में सेट)।

रेस्टशर्प एक अलग सामग्री-प्रकार क्यों वायरशर्क दिखा रहा है? और मैं सामग्री-प्रकार को कैसे बदला जा सकता हूं (यदि यह है)?

+5

तो आप 'ऐड पैरामीटर()' में अपने 'एप्लिकेशन/कुछ सामग्री प्रकार' का उपयोग क्यों नहीं करते? – svick

उत्तर

20

svick की टिप्पणी सही है। AddParameter() के पहले पैरामीटर में सामग्री प्रकार सेट करें और आप AddHeader() कॉल छोड़ सकते हैं।

हालांकि यह 'सही' उत्तर है, मैं समझाऊंगा कि ऐसा करने के लिए यह एक भ्रमित विधि क्यों है जो बिल्कुल स्पष्ट नहीं है।

इसे पूरा करने का इच्छित तरीका AddBody()RestRequest.RequestFormat के साथ उपयोग करना है। एक उदाहरण:

var client = new RestClient(); 
// client.XmlSerializer = new XmlSerializer(); // default 
// client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer 

var request = new RestRequest(); 
request.RequestFormat = DataFormat.Xml; 
request.AddBody(objectToSerialize); 

objectToSerialize की क्रमबद्धता पंजीकृत XmlSerializer पर आधारित है। यदि आप RequestFormat = DataFormat.Json का उपयोग करते हैं, तो RestClient.JsonSerializer का उपयोग किया जाता है। ISerializer के कार्यान्वयन (जिसे आप डिफ़ॉल्ट क्रमबद्धरण को ओवरराइड करने के लिए उपयोग कर सकते हैं) अपने स्वयं के सामग्री-प्रकार घोषित करते हैं जो कि आप उपयोग कर रहे हैं janky AddParameter() अधिभार के माध्यम से पारित हो जाता है।

AddParameter(contentType, content, ParameterType.RequestBody) को कभी भी सीधे नहीं कहा जाना था। हालांकि AddBody() से डेटा पास करने के लिए एक वर्कअराउंड के रूप में जोड़ा गया था, लेकिन फिर अन्य चीजें इस पर निर्भर हो गईं, इसलिए यह चारों ओर फंस गई। यह हिंडसाइट में एक भयानक निर्णय था लेकिन 1xx संस्करण लाइन में इसे बदलने में बहुत देर हो चुकी है। यदि मैंने कभी एक और संस्करण बनाया है तो मैं इसे और अधिक स्पष्ट कर दूंगा।

+2

यदि इसका उपयोग वास्तव में नहीं किया जाना है, तो आप इसे अप्रचलित के रूप में चिह्नित कर सकते हैं, इसलिए मौजूदा प्रोग्राम काम कर सकते हैं, लेकिन यह अब इंटेलिसेंस में दिखाई नहीं देता है, इससे अधिकांश उपयोगकर्ताओं को इसे अपने कोड में कॉल करने से रोका जा सकता है? – Stephanvs

+0

मुझे लगता है कि यह काफी अप्रचलित नहीं है। विशेषता जोड़ना '[System.ComponentModel.EditorBrowsable (System.ComponentModel.EditorBrowsableState.Never)] 'एक सुखद माध्यम (?) हो सकता है। –

+0

मैं इसके बारे में कुछ भी नहीं बदलना चाहता क्योंकि यह किसी अन्य मुद्दे पर एक अच्छी तरह से प्रचारित कामकाज है। –

1

जब आप शरीर की सामग्री सेट करते हैं तो यह सामग्री-प्रकार बदलना संभव है। बॉडी के लिए NAME पैरामीटर सामग्री-प्रकार सेट करता है।

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody }); 
संबंधित मुद्दे