2013-08-21 13 views
7

मैं RestSharp का उपयोग कर रहा हूं, और serialization के लिए Json.NET का उपयोग कर रहा हूं (here देखें)।मैं रेस्टशर्प को बीएसओएन का उपयोग कैसे कर सकता हूं?

जेसन.NET बीएसओएन का समर्थन करता है, और चूंकि मेरे कुछ अनुरोधों में द्विआधारी डेटा के विशाल ब्लॉक हैं, मुझे लगता है कि यह नाटकीय रूप से मेरे आवेदन को तेज करेगा। हालांकि, जहां तक ​​मैं कह सकता हूं, RestSharp में बीएसओएन के लिए कोई अंतर्निहित समर्थन प्रतीत नहीं होता है।

जेसन.NET का उपयोग RestSharp के लिए एक कस्टम धारावाहिक के रूप में कार्यान्वित किया गया है, और इसलिए पहली नज़र में ऐसा लगता है कि बीएसओएन का उपयोग करने के लिए उस कस्टम धारावाहिक को संशोधित करना संभव होगा। लेकिन, SerializeRestSharp.Serializers.ISerializer इंटरफ़ेस का तरीका string देता है - जो कि (मुझे लगता है) बीएसओएन के लिए अनुपयुक्त है। इसलिए, मुझे लगता है कि इस परिवर्तन को लागू करने के लिए RestSharp में कुछ और महत्वपूर्ण बदलाव आएंगे।

क्या किसी ने ऐसा करने का कोई तरीका निकाला है?


अद्यतन: मैं RestSharp स्रोत को देखा और पाया कि RestRequest.AddBody विधि है कि मेरे वस्तु लेता है और अनुरोध शरीर में यह धारावाहिक करता है अंततः Request.AddParameter कॉल (धारावाहिक वस्तु डेटा के साथ, और पैरामीटर प्रकार RequestBody)।

मुझे लगा कि मैं बीएसओएन को अपनी ऑब्जेक्ट को क्रमबद्ध करने में सक्षम हो सकता हूं और फिर सीधे Request.AddParameter पर कॉल कर सकता हूं - और वास्तव में मैं कर सकता हूं। हालांकि, जब RestSharp RestRequest निष्पादित करता है, तो यह बाइनरी सामग्री को अनुरोध में डालने में विफल रहता है, क्योंकि यूटीएफ -8 एन्कोडेड अनुरोध सामग्री के बारे में अन्य एम्बेडेड धारणाएं हैं।

इस प्रकार यह इस हैक की तरह दिखता है काम नहीं होगा - वहाँ ही RestSharp के लिए किए गए कुछ परिवर्तन करने की आवश्यकता होगी, और मैं इस काम के लिए आदमी ...


अद्यतन 2 नहीं कर रहा हूँ: मैं डिस्गर का उपयोग करने के लिए डीबगर का उपयोग करने का फैसला करने के लिए यह पता लगाने के लिए कि कितना रेस्टशर्प मुझे शरीर-एन्कोडिंग मुद्दे को दूर करने के लिए बदलना होगा, इसलिए मैंने रेस्टशर्प के अपने NuGet संस्करण को बदल दिया और मेरे समाधान में RestSharp प्रोजेक्ट को शामिल किया। और ... काम किया।

यह पता चला है कि पिछले कुछ महीनों में रेस्टशर्प में बदलाव आया है जो अभी तक NuGet संस्करण में नहीं है।

तो, आप अब AddParameter उपयोग कर सकते हैं और पहले से BSON एन्कोड वस्तु में पारित, और RestSharp शिकायत के बिना सर्वर के लिए रवाना भेज देंगे।

उत्तर

6

मेरे सवाल में अपडेट के अनुसार, यह पता चला है कि अगर आप नवीनतम RestSharp स्रोत है, तो बजाय इस बात का है कि:

 request.AddBody(myObject); 

... आप के बजाय जब भी आप एक पेलोड कि होता है यह कर सकते हैं BSON का उपयोग करने से लाभ:

 using (var memoryStream = new System.IO.MemoryStream()) 
     { 
      using (var bsonWriter = new Newtonsoft.Json.Bson.BsonWriter(memoryStream)) 
      { 
       var serializer = new Newtonsoft.Json.JsonSerializer(); 

       serializer.Serialize(bsonWriter, myObject); 

       var bytes = memoryStream.ToArray(); 

       request.AddParameter("application/bson", bytes, RestSharp.ParameterType.RequestBody); 
      } 
     } 

ध्यान दें कि AddParameter को पहले पैरामीटर माना जाता है कि पैरामीटर नाम है, लेकिन ParameterType.RequestBody के मामले में यह वास्तव में सामग्री प्रकार के रूप में प्रयोग किया जाता है। (युक)।

ध्यान दें कि यह एक change ewanmellor/ayoung द्वारा 11 अप्रैल 2013 को RestSharp करने के लिए बनाया पर निर्भर करता है, और यह परिवर्तन नहीं NuGet पर वर्तमान संस्करण (104.1) में है।इसलिए यह केवल तभी काम करेगा यदि आप अपने प्रोजेक्ट में वर्तमान RestSharp स्रोत शामिल करते हैं।

3

गैरी का अपने प्रश्न का उत्तर आराम से कॉल करने के लिए अविश्वसनीय रूप से उपयोगी था। मैं जवाब देना चाहता था कि JSON.NET का उपयोग करके आराम से कॉल कैसे करें। मैं Silverlight के लिए RestSharp संस्करण 104.4 का उपयोग कर रहा हूँ। मेरा सर्वर वेब एपीआई 2.1 with BSON support turned on का उपयोग कर रहा है।

, फिर एक BSON प्रतिक्रिया को स्वीकार करने के लिए, तो

public class BsonDeserializer : IDeserializer 
{ 
    public string RootElement { get; set; } 
    public string Namespace { get; set; } 
    public string DateFormat { get; set; } 

    public T Deserialize<T>(IRestResponse response) 
    { 
     using (var memoryStream = new MemoryStream(response.RawBytes)) 
     { 
      using (var bsonReader = new BsonReader(memoryStream)) 
      { 
       var serializer = new JsonSerializer(); 
       return serializer.Deserialize<T>(bsonReader); 
      } 
     } 
    } 
} 

तरह RestSharp के लिए एक BSON deserializer बनाने के लिए आपके अनुरोध सुनिश्चित स्वीकार करता है "application/bson"

var request = new RestRequest(apiUrl, verb); 
request.AddHeader("Accept", "application/bson"); 

और वह मीडिया के लिए एक हैंडलर जोड़ने टाइप करें

var client = new RestClient(url); 
client.AddHandler("application/bson", new BsonDeserializer()); 
+0

इस उत्तर में मुझे बहुत मदद मिली, अगर किसी को अपवाद मिल रहा है "अनुक्रम में अधिक था n एक तत्व "हैंडलर जोड़ते समय, मैंने डिफ़ॉल्ट शीर्षलेख को RestClient उदाहरण में जोड़ने से पहले हैंडलर जोड़कर इसे ठीक किया – yvesmancera

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