2015-02-15 6 views
5

RestSharp मुझे पोस्ट अनुरोध के लिए सामग्री-प्रकार को ओवरराइड करने की अनुमति नहीं देता है। मैंने here को प्राप्त करने के लिए दिशानिर्देशों का पालन नहीं किया है। मैंने अनुरोध के माध्यम से हेडर सामग्री प्रकार मैन्युअल रूप से एप्लिकेशन/जेसन को सेट करने का भी प्रयास किया है। AddHeaders ("content-type", "application/json");RestSharp डिफ़ॉल्ट सामग्री के लिए सामग्री-प्रकार/x-www-form-urlencoded पर पोस्ट

अनुरोध निष्पादन के उदाहरण:

private IRestResponse ExecuteRequest<T>(string resource, Method method, T model) 
{ 
    var client = CreateRestClient(); 
    var request = new RestRequest(resource, method) 
    { 
     RequestFormat = DataFormat.Json 
    }; 
    var json = JsonConvert.SerializeObject(model); 

    request.AddHeader("Accept", "application/json"); 
    request.AddHeader("User-Agent", "Fiddler"); 
    request.Parameters.Clear(); 
    request.AddParameter("auth_token", _apiKey); 
    request.AddParameter("application/json", json, ParameteType.RequestBody); 

    return client.Execute(request); 
} 

प्रतिक्रिया त्रुटि संदेश:

{ 
    "error": { 
    "code": 400, 
    "message": "The request requires a properly encoded body with the 'content-type' header set to '['application/json']", 
    "type": "Bad Request" } 
} 

फ़िडलर अनुरोध कच्चे डेटा:

POST **omitted** HTTP/1.1 
Accept: application/json, application/xml, text/json, text/x-json,text/javascript, text/xml 
User-Agent: RestSharp/105.0.1.0 
Content-Type: application/x-www-form-urlencoded 
Host: **omitted** 
Content-Length: 51 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 

आप देख सकते हैं, अनुरोध सामग्री- प्रकार अभी भी आवेदन/एक्स-www-form-urlencoded है। कोई विचार? (अग्रिम धन्यवाद)

उत्तर

8

ऐसा प्रतीत होता है कि रीस्टशर्प पोस्ट अनुरोधों के लिए पैरामीटर का अर्थ कैसे देता है इसकी एक गलतफहमी है। गूगल समूह पर जॉन शीहान पद से:

यदि यह एक GET अनुरोध है, तो आप एक अनुरोध शरीर नहीं हो सकता है और AddParameter यूआरएल क्वेरी स्ट्रिंग के लिए मूल्यों को कहते हैं। यदि यह एक पोस्ट है तो आप POST पैरामीटर और एक क्रमबद्ध अनुरोध निकाय शामिल नहीं कर सकते क्योंकि वे समान स्थान पर कब्जा करते हैं। आप एक मल्टीपार्ट पोस्ट बॉडी कर सकते हैं लेकिन यह सामान्य नहीं है। यदि आप किसी POST- यूआरएल क्वेरी स्ट्रिंग मान सेट करने के लिए एक ही रास्ता बना रहे हैं दुर्भाग्य से यदि संयोजन या UrlSegments या तो स्ट्रिंग के माध्यम से है:

var key = "12345"; 
var request = new RestRequest("api?key=" + key); 
// or 
var request = new RestRequest("api?key={key}); 
request.AddUrlSegment("key", "12345"); 

मेरे संशोधित निष्पादित अनुरोध विधि अब काम करता है कि इस तरह दिखता है:

private IRestResponse ExecuteRequestAsPost<T>(T model, string resource, Method method) 
{ 
    resource += "?auth_token={token}"; 
    var client = CreateRestClient(); 
    var request = new RestRequest(resource, method) { RequestFormat = DataFormat.Json }; 
    var json = JsonConvert.SerializeObject(model); 
    request.AddHeader("User-Agent", "Fiddler"); 

    request.AddUrlSegment("token", _apiKey); 
    request.AddParameter("application/json", json, ParameterType.RequestBody); 

    return client.Execute(request); 
} 
+1

धन्यवाद, यह मेरे लिए काम करता है। यहां महत्वपूर्ण बदलाव यह है कि मेरे लिए यह किया गया था कि आपने अनुरोध कैसे किया .addParameter()। –

1

ऐसा लगता है कि आपने इसे समझ लिया होगा, लेकिन यदि आप एक विकल्प में रूचि रखते हैं, तो Flurl लिखने में मेरे लक्ष्यों में से एक यह स्पष्ट होना था कि आप अपने पैरामीटर कहां रखना चाहते हैं लेकिन फिर भी इसे कम कोड इस मामले में, पूरा अनुरोध इस तरह कुछ दिखाई देगा:

var response = await baseUrl 
    .AppendPathSegment(resource) 
    .SetQueryParam("auth_token", _apiKey) 
    .WithHeader("User-Agent", "Fiddler") 
    .PostJsonAsync(model); 
+0

दिलचस्प, मैं एक नज़र डालेगा! –

+1

हम्म ... * "Flurl.Http 0.4 के रूप में, अंतर्निहित HttpClient के उदाहरण डिफ़ॉल्ट रूप से प्रत्येक HTTP कॉल के तुरंत बाद निपटाए जाते हैं" *। ऐसा नहीं है कि 'HttpClient' को काम करने के लिए डिज़ाइन किया गया है। देखें [ए: वेबएपीआई क्लाइंट में एक नया एचटीपी क्लाइंट प्रति कॉल बनाने का ओवरहेड क्या है?] (Http://stackoverflow.com/a/22561368/692942) – Lankymart

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