2012-09-03 14 views
21

में LINK और UNLINK HTTP क्रियाओं का उपयोग कर मैं वर्तमान में एक आरईएसटी एपीआई लागू करने पर काम कर रहा हूं। मेरे पास संसाधन संसाधन है जिसमें व्यक्तिगत संसाधनों के बीच बड़ी संख्या में संबंध हैं।एक आरईएसटी एपीआई

मेरा प्रश्न है: आप एक मौजूदा तरीके से दो मौजूदा संसाधनों को कैसे जोड़ते हैं (रिलेशनशिप स्थापित करना)?

एक समाधान जो मैंने पार किया वह लिंक और यूएनLINK HTTP क्रियाओं का उपयोग था। एपीआई उपभोक्ता लिंक और यूआरआई के बाद दो संसाधनों को जोड़ने में सक्षम होगा:/resource1 /: id1/resource2 /: id2।

इस समाधान के साथ समस्या LINK और UNLINK क्रियाओं के लिए समर्थन की कमी है। न तो http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html या http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol क्रियाओं का जिक्र करते हैं, और वे काफी हद तक "भूल गए" प्रतीत होते हैं। हालांकि, मूल आरएफसी 2068 बताता है कि वे मौजूद हैं।

मुझे वास्तव में यह समाधान पसंद है। हालांकि, मुझे डर है कि कई एपीआई उपभोक्ता/ग्राहक LINK/UNLINK के समर्थन की कमी के कारण समाधान से निपटने में सक्षम नहीं होंगे। क्या यह एक स्वीकार्य समाधान है या मौजूदा संसाधनों को एक विश्वसनीय API में जोड़ने के लिए कोई बेहतर और/या अधिक सुरुचिपूर्ण समाधान है?

धन्यवाद

+1

दो संसाधनों को जोड़ने वाले लिंक संसाधन क्यों नहीं बनाते? –

+2

यह एक और समाधान है जिसे मैं विचार कर रहा था (यह इस [SO सवाल] में बहुत अधिक संभाला गया है (http://stackoverflow.com/questions/6324547/how-to-handle-many-to-many-relationships-in-a-restful -पीआई)। हालांकि, समस्या यह है कि हर प्रकार के संबंध के लिए, आपको एक नया संसाधन (प्रकार) परिभाषित करना होगा।यह संसाधन मॉडल को अधिक जटिल बनाता है और विशेष रूप से व्यावहारिक नहीं है (क्योंकि आपके एपीआई उपभोक्ता को बहुत अधिक संसाधनों के बारे में पता होना चाहिए)। लिंक/यूएनLINK इसे कम नहीं करता है: रिश्ते स्थापित करना बहुत अनुमानित है और इस प्रकार उपयोग करना आसान है। हालांकि, अगर LINK/UNLINK शायद ही समर्थित हैं ... –

उत्तर

24

मैं LINK और मेरे (bespoke, कंपनी आंतरिक) वेब एप्लिकेशन में UNLINK का उपयोग करें। मैं अपने कार्यान्वयन संदर्भ के रूप में http://tools.ietf.org/html/draft-snell-link-method का उपयोग करता हूं।

मैंने पाया वहाँ ग्राहकों के तीन प्रकार हैं कि:

  1. उन है कि केवल GET और POST समर्थन, एचटीएमएल के <form> तत्व से उनके संकेत ले रही।
  2. जो केवल GET, PUT, POST और DELETE का समर्थन करते हैं। ये सीआरयूडी और आरपीसी-नाटक-से-बी-आरईएसटी प्रकार एपीआई से अपने संकेत लेते हैं।
  3. जो किसी भी विधि की अनुमति देते हैं। एक आधिकारिक आरएफसी के रूप में PATCH के प्रकाशन ने इनकी मात्रा में वृद्धि की है, जैसा कि वेबडीवीवी की वृद्धि हुई है, हालांकि कभी-कभी श्रेणी 2 ग्राहक PATCH का भी समर्थन करते हैं।

जब से हम वर्तमान में, हमारे ग्राहकों को घर में हम इस समस्या नहीं है का विकास है, लेकिन मैं इस पर ध्यान दिया है और पक्ष-विपक्ष मेरी एपीआई को परिभाषित करने से पहले विचार किया मामले में हम तीसरे अनुमति देने के लिए करना चाहता था पार्टी क्लाइंट्स मेरा समाधान (चूंकि हमें जावास्क्रिप्ट के बिना एचटीएमएल क्लाइंट्स का समर्थन करने की आवश्यकता है)को _METHOD फ़ील्ड (application/x-www-form-urlencoded) की आपूर्ति करके विधि को ओवरराइड करने की अनुमति देना था और फिर मेरे post() फ़ंक्शन को बैक-एंड हथेली पर फ़ंक्शन के लिए उपयुक्त फ़ंक्शन पर बंद करना है HTTP विधि। इस तरह, भविष्य में कोई भी क्लाइंट, ऊपर, कक्षा 2, PUT और DELETE का उपयोग कर सकता है लेकिन PATCH, LINK और UNLINK को POST अनुरोध में लपेट सकता है। आपको दोनों दुनिया के सर्वश्रेष्ठ मिलते हैं: ग्राहकों का समृद्ध तरीका जो इसका समर्थन करते हैं, और फिर भी पोस्ट-सुरंग के माध्यम से निम्न गुणवत्ता वाले ग्राहकों का समर्थन करते हैं।

+0

मैं इस उत्तर से पूरी तरह से सहमत हूं। मैंने इसे सितंबर में इस तरह से लागू करने के लिए समाप्त कर दिया और मुझे खुशी है कि कोई और एक ही निष्कर्ष पर आया। धन्यवाद! –

+0

आपका स्वागत है :) –

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