2013-02-08 13 views
5

यूट्यूब एपीआई में, "partial feed" का अनुरोध करने की शक्ति है।सर्विसस्टैक का उपयोग करके यूट्यूब एपीआई जैसे आंशिक अनुरोध और प्रतिक्रिया को आप कैसे कार्यान्वित करेंगे?

यह ऐप डेवलपर को वापस आने वाले डेटा के आकार और स्टर्चर को प्रदर्शित करने की अनुमति देता है, जो "फ़ील्ड" लौटने के लिए निर्दिष्ट करता है।

i.e. GET api/person/1?fields=(id,email) एक डीटीओ वापस करेगा जिसमें केवल id और email फ़ील्ड होंगे, न कि संपूर्ण व्यक्ति प्रतिक्रिया।

सर्विसस्टैक का उपयोग करके आप इसका प्रयास कैसे करेंगे? प्रतिक्रिया ऑब्जेक्ट में कौन से गुण शामिल करना है, यह नियंत्रित करने के लिए धारावाहिक को कॉलबैक संलग्न करने का कोई तरीका है?

उत्तर

1

मेरे अनुभव से servicestack केवल उन क्षेत्रों को लौटाता है जिनमें वास्तव में डेटा है। यदि मेरा अनुभव सही है तो आपको केवल इतना करना होगा कि अनुरोध को आर्किटेक्ट करने का सबसे अच्छा तरीका पता है ताकि वह विशिष्ट डेटा लौटने के लिए कह रहा हो, इस तरह आप केवल अनुरोध किए गए डेटा के साथ प्रतिक्रिया को पॉप्युलेट करेंगे, इस प्रकार servicestack केवल उस पर वापस आ जाएगा ।

+0

मैंने इस विधि पर विचार किया था, और यह करने का एकमात्र संभव तरीका हो सकता है।यह प्रॉपर्टी ट्री को उन क्षेत्रों को स्थापित करने के लिए डबल हैंडलिंग जैसा लगता है, जिन्हें आप शून्य पर वापस नहीं करना चाहते हैं, क्योंकि सीरियलज़र जेसन प्रतिक्रिया को आउटपुट करने के लिए फिर से संपत्ति के पेड़ पर जा रहा है। – jmc

+1

अगर नल लौटाया जाता है या नहीं तो नियंत्रण करने के लिए एक कॉन्फ़िगरेशन प्रॉपर्टी होती है। 'JsConfig.IncludeNullValues' – jmc

+0

दुर्भाग्य से यह मूल्य-टाइप किए गए डीटीओ सदस्यों के लिए काम नहीं करेगा। – starteleport

0

ServiceStack.Text.JsConfig गुणों को देखें, उनके पास सभी हुक और अनुकूलन सेवास्टैक के टेक्स्ट सीरियलाइज़र समर्थन हैं। विशेष रूप से हुक है कि आप कस्टम अक्रमांकन करने की अनुमति कर रहे हैं:

JsConfig<T>.DeserializeFn 
JsConfig<T>.RawDeSerializeFn 
JsConfig<T>.OnDeserializedFn 
+0

मैं सीरियलाइजेशन को कस्टमाइज़ करना चाहता हूं, Deserialise नहीं। मैंने जेएसकॉन्फिग गुणों पर एक नज़र डाली, और बहिष्कारप्रोपर्टी नाम मुझे जो चाहिए, उसके करीब है, लेकिन मैं इसे टाइप स्तर पर परिभाषित नहीं करना चाहता था, लेकिन प्रति-अनुरोध के आधार पर। – jmc

0

हम को लागू करने में सक्षम थे ने कहा कि कस्टम सेवा धावक जोड़ने और आवश्यक प्रतिक्रिया डीटीओ द्वारा निर्धारित क्षेत्र के साथ ExpandoObject के निर्माण के लिए इसमें कुछ प्रतिबिंब का उपयोग करके छानने। सेवा धावकों पर अधिक जानकारी के लिए this देखें।

1

मैंने इसे एक एपीआई के लिए कार्यान्वित किया जो केवल JSON लौटाता है।

सबसे पहले मैं करने के लिए दो structs बनाया (डी) को क्रमानुसार और "फील्ड" क्वेरी तर्क पुनरावर्ती वाक्य रचना की व्याख्या:

  • FieldSelector है, जो एक क्षेत्र निर्दिष्ट करता है और संभवतः अपने बच्चों FieldSelection कोष्ठक के बीच संलग्न;
  • FieldsSelection, जो FieldSelector की अल्पविराम से अलग सूची है।

मैं वर्गों के बजाय structs का उपयोग किया है, क्योंकि AFAIK, आप वर्ग (डी) क्रमबद्धता/से ServiceStack के URL में करती है। Structs के साथ आप इसे ToString (सीरिएलाइज़र) ओवरराइड करके और पैरामीटर (deserializer) के रूप में एक स्ट्रिंग को स्वीकार करने वाला एक कन्स्ट्रक्टर प्रदान कर सकते हैं।

तो फिर तुम हर अनुरोध डीटीओ कि JSON देता है पर इस में शामिल हैं:

FieldsSelection Fields { get; set; } 

एक कस्टम पर ServiceRunner<T>.OnAfterExecute आप JSON के जवाब डीटीओ को क्रमानुसार, ServiceStack.Text के JsonObject साथ उसे पार्स और एक साथ रिकर्सिवली क्षेत्रों चयन लागू इस तरह विधि:

private static JsonObject Apply(this JsonObject json, FieldsSelection fieldMask) 
{ 
    IEnumerable<string> keysToRemove = json.Keys.ToList().Except(fieldMask.Keys); 

    foreach (var key in keysToRemove) 
    json.Remove(key); 

    foreach (var selector in fieldMask.Selectors.Values.Where(s => s.HasSubFieldsSelection)) 
    { 
    var field = json[selector.Field]; 
    if (field == null) 
     continue; 

    switch (field[0]) 
    { 
     case '{': 
     json[selector.Field] = Apply(json.Object(selector.Field), selector.SubFieldsSelection).ToJson(); 
     break; 
     case '[': 
     var itensArray = json.ArrayObjects(selector.Field); 
     for (int i = 0; i < itensArray.Count; i++) 
      itensArray[i] = Apply(itensArray[i], selector.SubFieldsSelection); 
     json[selector.Field] = itensArray.ToJson(); 
     break; 
     default: 
     throw new ArgumentException("Selection incompatible with object structure"); 
    } 
    } 

    return json; 
} 

तो आप अपनी प्रतिक्रिया डीटीओ के रूप में परिणाम लौटने। मैंने नकारात्मक फ़ील्ड चयनकर्ताओं को भी लागू किया है (fields=-foo foo को छोड़कर सभी डीटीओ फ़ील्ड का चयन करता है), लेकिन आपको विचार मिलता है।

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