2012-10-17 16 views
9

मैंServiceStack रूटिंग

public string ID {get;set;}  
activities/1 

की एक आईडी (जो RavenDB से आता है) के साथ एक इकाई है।

मैं अपने ServiceStack AppHost

Routes 
    .Add<Activity>("/activities") 
    .Add<Activity("/activities/{id}"); 

में निम्नलिखित मार्गों को पंजीकृत कर रहा हूँ मैं पोस्ट करने के लिए एक रीढ़ एप्लिकेशन का उपयोग कर रहा है और मेरे बाकी सेवा के लिए रखा।

आउट-ऑफ-द-बॉक्स क्या होता है:

  • आईडी संपत्ति के रूप में "गतिविधियों/1"
  • आईडी संपत्ति "गतिविधियों% 2F1" के रूप में मार्ग में एन्कोड किया गया है json में धारावाहिक रूप है
  • सर्विसस्टैक यूआरएल आधारित आईडी प्रॉपर्टी को प्राथमिकता देता है, इसलिए मेरी स्ट्रिंग को एन्कोडेड मान मिलता है जो सीधे RavenDb के लिए उपयोग नहीं करता है।

    • रीढ़ बदलें बल्कि हाइफ़न का उपयोग करने से
    • स्लैश
    • बदलें RavenDb आईडी पीढ़ी में करने के लिए "/ गतिविधियों" पोस्ट और JSON Serialiser लात जाने के लिए:

    विकल्प के बारे में पता कर रहा हूँ

  • सेट पर इनकोडिंग% 2F के लिए मेरी ईद संपत्ति पार्स करें और एक स्लेश

दोनों है कि मैं या तो RESTfuln खो में नुकसान में बदलने का मेरे एपीआई में निबंध, जो अवांछित है, या मैं RavenDb सम्मेलनों का पालन नहीं करता, जो आम तौर पर फॉक्स के बाहर समझदार होते हैं। इसके अलावा, मेरे पास स्लेश होने के लिए व्यक्तिगत प्राथमिकता है।

तो मुझे आश्चर्य है कि क्या सर्विसिसस्टैक में कोई अन्य विकल्प है जो मैं इस समस्या को हल करने के लिए उपयोग कर सकता हूं जिसमें कम समझौता शामिल है? या तो Serialiser अनुकूलन या वाइल्डकार्ड रूटिंग मेरे सिर में हैं ....

उत्तर

10

मुझे एएसपी.Net वेबएपीआई के साथ एक ही समस्या है, इसलिए मुझे नहीं लगता कि यह एक सर्विसस्टैक मुद्दा है, लेकिन केवल निपटने के साथ एक सामान्य चिंता है एक आरईएसटी यूआरएल पर रेवेन स्टाइल आईडी के साथ।

[{ 
    Id:"users/1", 
    Name:"John" 
}, 
{ 
    Id:"users/2", 
    Name:"Mary" 
}] 

अब मैं एक विशिष्ट उपयोगकर्ता प्राप्त करना चाहते हैं:

उदाहरण के लिए, मान लीजिए कि मैं GET: /api/users क्वेरी और की तरह एक परिणाम वापसी करते हैं। अगर मैं शुद्ध आरईएसटी दृष्टिकोण का पालन करता हूं, तो आईडी इस दस्तावेज़ से एकत्र की जाएगी, और फिर मैं इसे यूआरएल के आईडी भाग में पास कर दूंगा। यहां समस्या यह है कि यह GET: /api/users/users/1 जैसा दिखता है जो केवल भ्रमित नहीं है, लेकिन स्लैश वेबएपीआई (और सर्विसस्टैक) मार्ग विधियों को क्रिया विधियों के तरीके के तरीके में प्राप्त करता है।

मैंने जो समझौता किया वह आईडी को यूआरएल के परिप्रेक्ष्य से पूर्णांक के रूप में माना जाता था। तो ग्राहक GET: /api/users/1 पर कॉल करता है, और मैं अपनी विधि को public User Get(int id) के रूप में परिभाषित करता हूं।

अच्छा हिस्सा यह है कि रावेन के session.Load(id) में ओवरलोड हैं जो पूर्ण स्ट्रिंग फॉर्म या पूर्णांक फ़ॉर्म लेते हैं, इसलिए आपको अधिकतर समय अनुवाद करने की आवश्यकता नहीं है।कॉलिंग यह session.GetStringIdFor<User>(id) के रूप में सरल है

public static string GetStringIdFor<T>(this IDocumentSession session, int id) 
{ 
    var c = session.Advanced.DocumentStore.Conventions; 
    return c.FindFullDocumentKeyFromNonStringIdentifier(id, typeof (T), false); 
} 

:

आप मिलती है, तो अपने आप को आईडी अनुवाद करने के लिए की आवश्यकता होगी, तो आप इस विस्तार विधि का उपयोग कर सकते हैं। मुझे आमतौर पर केवल मैन्युअल रूप से अनुवाद करना पड़ता है यदि मैं दस्तावेज़ को तुरंत लोड करने के अलावा आईडी के साथ कुछ कर रहा हूं।

मैं समझता हूं कि इस तरह के आईडी को अनुवाद करके, कि मैं कुछ आरईएसटी शुद्धवादी सम्मेलनों को तोड़ रहा हूं, लेकिन मुझे लगता है कि यह परिस्थितियों को उचित है। मुझे किसी भी वैकल्पिक दृष्टिकोण में दिलचस्पी होगी जो किसी के साथ आता है।

+0

इस मैट के लिए धन्यवाद। तो क्या आप GET:/api/उपयोगकर्ताओं से एक इंटीजर आईडी लौट रहे हैं? – Chris

+0

नहीं, मुझे परिणाम सेट में हेरफेर करने के लिए यह बहुत बेकार लगता है, इसलिए मैं सिर्फ पूर्ण स्ट्रिंग आईडी वापस कर देता हूं। क्लाइंट ऐप पूर्ण स्ट्रिंग आईडी रखता है, लेकिन जब यह किसी आईडी के साथ यूआरएल बनाता है, तो यह id.split ("/") जैसे कुछ का उपयोग करके सामने वाले हिस्से को स्ट्रिप करता है [1] –

0

RavenDB के साथ Durandal JS को आजमाते समय मुझे यह समस्या थी।

मेरा कामकाज यूआरएल को काम करने के लिए बहुत थोड़ा बदलना था। तो अपने उदाहरण में:

GET /api/users/users/1 

GET /api/users/?id=users/1 

बने jQuery से, इस हो जाता है:

var vm = {}; 
vm.users = []; 

$.get("/api/users/?" + $.param({ id: "users/1" }) 
    .done(function(data) { 
     vm.users = data; 
    }); 
संबंधित मुद्दे