2015-04-23 9 views
5

हमारे पास परिदृश्य है जहां बाहरी एपीआई या तो उपयोगकर्ता एक्सएमएल या त्रुटि एक्सएमएल देता है, भले ही अनुरोध सफल हो या विफल हो।क्या Restsharp को 2 प्रकार की ऑब्जेक्ट्स पास करना संभव है?

फिलहाल मैं उपयोगकर्ता पीओसीओ को रेस्टशर्प में पास कर रहा हूं और ठीक काम करता हूं। लेकिन अगर यह विफल रहता है, तो यह वस्तु पूर्ण है। और हम नहीं जानते कि यह विफल क्यों हुआ जब तक हम त्रुटि एक्सएमएल मैन्युअल रूप से पार्स नहीं करते।

क्या यह काम करने का कोई तरीका है?

उदा

var restClient = new RestClient(baseURL); 
var request = new RestRequest(uri); 
request.Method = Method.POST; 
var response = restClient.Execute<User>(request); 

उपरोक्त विधि के निष्पादन पर एपीआई त्रुटि xml ऑब्जेक्ट वापस कर सकता है। मैं विफलता पर त्रुटि ऑब्जेक्ट कैसे प्राप्त करूं और सफलता पर उपयोगकर्ता कैसे प्राप्त करूं?

+0

आप कोड है कि काम नहीं करता है में शामिल हैं सकता है? – svick

+0

हाँ कृपया –

+1

अपडेट करें मुझे लगता है कि अगर यह या तो त्रुटि एक्सएमएल या उपयोगकर्ता एक्सएमएल वापस कर सकता है, तो यह 'उपयोगकर्ता' वापस नहीं कर रहा है। सर्वर डेवलपर्स के हिस्से पर दो अलग-अलग एक्सएमएल प्रारूपों को वापस करने के लिए खराब डिज़ाइन। क्या एक्जिक्यूट का एक रूप है जो एक्सएमएल देता है? फिर आप एक्सएमएल को देख सकते हैं कि यह कौन सा प्रारूप है, और इसे 'उपयोगकर्ता' या 'त्रुटि' ऑब्जेक्ट्स में deserialize। –

उत्तर

4

यह संभव है, हालांकि कोड थोड़ा बदसूरत है। RestSharp आपको अपना स्वयं का एक्सएमएल deserializer निर्दिष्ट करने की अनुमति देता है, इसलिए हमें यह काम करने के लिए ऐसा करने की आवश्यकता होगी।

हालांकि, सबसे पहले आप एक डेटा प्रकार है कि या तो एक Error या एक User (मैं इसे सामान्य यह अधिक से अधिक सिर्फ उपयोगकर्ताओं के लिए काम करता है ताकि बनाया) स्टोर कर सकते हैं की जरूरत है:

public class Result<T> 
{ 
    public T Data { get; set; } 
    public Error Error { get; set; } 
} 

तो विचार है, अब जब आप अनुरोध को निष्पादित, आप RestSharp एक Result<User> के लिए बजाय सिर्फ एक User की पूछते हैं, अर्थात्:

अब यहाँ जादू के रूप में deserialize करने के लिए आवश्यक है या तो एक Error या User। यह एक कस्टम deserializer है जो RestSharp के XmlDeserializer से विरासत में मिलता है। चेतावनी: यह कोड बिल्कुल परीक्षण नहीं किया गया है, लेकिन यह उम्मीद है कि आपको सही दिशा में इंगित कर सकता है।

public class XmlResultDeserializer : XmlDeserializer 
{ 
    public override T Deserialize<T>(IRestResponse response) 
    { 
     if (!typeof(T).IsGenericType || typeof(T).GetGenericTypeDefinition() != typeof(Result<>)) 
      return base.Deserialize<T>(response); 

     // Determine whether the response contains an error or normal data. 
     var doc = XDocument.Parse(response.Content); 
     var result = Activator.CreateInstance<T>(); 
     if (doc.Root != null && doc.Root.Name == "Error") 
     { 
      // It's an error 
      var error = base.Deserialize<Error>(response); 
      var errorProperty = result.GetType().GetProperty("Error"); 
      errorProperty.SetValue(result, error); 
     } 
     else 
     { 
      // It's just normal data 
      var innerType = typeof(T).GetGenericArguments()[0]; 
      var deserializeMethod = typeof(XmlDeserializer) 
       .GetMethod("Deserialize", new[] { typeof(IRestResponse) }) 
       .MakeGenericMethod(innerType); 
      var data = deserializeMethod.Invoke(this, new object[] { response }); 

      var dataProperty = result.GetType().GetProperty("Data"); 
      dataProperty.SetValue(result, data); 
     } 
     return result; 
    } 
} 

तो फिर तुम यह सब तार होगा इस तरह:

var restClient = new RestClient(baseURL); 
client.AddHandler("application/xml", new XmlResultDeserializer()); 
var request = new RestRequest(uri); 
request.Method = Method.POST; 
var result = restClient.Execute<Result<User>>(request); 
if (response.Data.Data != null) 
{ 
    var user = response.Data.Data; 
    // Do something with the user... 
} 
else if (response.Data.Error != null) 
{ 
    var error = response.Data.Error; 
    // Handle error... 
} 
संबंधित मुद्दे