अन्य एपीआई डिजाइन - विभिन्न मापदंडों लेकिन समान यूआरएल पैटर्न के साथ आरईएसटी के माध्यम से एक संसाधन प्राप्त करना


92

मेरे पास REST url डिज़ाइन से संबंधित एक प्रश्न है। मुझे यहां कुछ प्रासंगिक पोस्ट मिलीं: एक ही संसाधन के अलग-अलग रिप्रेजेंटेटिव रिप्रेजेंटेशन और यहां: विभिन्न फील्ड्स द्वारा GET रिसोर्स के लिए Restful url लेकिन बेस्ट प्रैक्टिस क्या और क्यों हैं, इस पर प्रतिक्रियाएं बिल्कुल स्पष्ट नहीं हैं। यहाँ एक उदाहरण है।

मेरे पास "उपयोगकर्ता" संसाधन का प्रतिनिधित्व करने के लिए अन्य यूआरएल हैं। मैं एक आईडी या एक ईमेल पते के साथ एक उपयोगकर्ता प्राप्त कर सकता हूं लेकिन URL प्रतिनिधित्व दोनों के लिए समान रहता है। बहुत सारे ब्लॉग और किताबों से गुजरते हुए मैंने देखा कि लोग कई अलग-अलग तरीकों से ऐसा करते रहे हैं। उदाहरण के लिए

इस अभ्यास को एक पुस्तक में पढ़ें और कहीं-कहीं स्टैकओवरफ़्लो पर (मैं फिर से लिंक नहीं खोज सकता)

GET /users/id={id}
GET /users/email={email}

इस अभ्यास को बहुत सारे ब्लॉग पर पढ़ें

GET /users/{id}
GET /users/email/{email}

सामान्य रूप से url द्वारा दर्शाए गए संसाधनों के परिणामों को फ़िल्टर करने के लिए क्वेरी पैराम्स का उपयोग किया जाता है, लेकिन मैंने इस अभ्यास को भी देखा है

GET /users?id={id}
GET /users?email={email}

मेरा सवाल यह है कि इन सभी प्रथाओं में से कौन सा डेवलपर्स एपिस और क्यों का उपयोग करने वालों के लिए सबसे अधिक समझदार होगा? मेरा मानना ​​है कि REST url डिजाइन और नामकरण परंपराओं की बात करें तो पत्थर में कोई नियम निर्धारित नहीं हैं, लेकिन मैं सिर्फ यह जानना चाहता था कि डेवलपर्स को एपिस को बेहतर तरीके से समझने में मुझे कौन सा रास्ता अपनाना चाहिए।

सभी मदद की सराहना की!


1
मुझे पता है कि यह थोड़ा पुराना है, लेकिन इसी तरह के संसाधनों की तलाश में मैं इस सवाल पर ठोकर खा रहा हूं और जिसे आप ढूंढ रहे थे। मेरा मानना ​​है कि यह एक है stackoverflow.com/a/9743414/468327
जोएल बर्जर

जवाबों:


104

मेरे अनुभव में, GET /users/{id} GET /users/email/{email}सबसे आम दृष्टिकोण है। यदि कोई उपयोगकर्ता प्रदत्त idया के साथ मौजूद नहीं है, तो मैं 404 नहीं मिलने के तरीकों की भी उम्मीद करूंगा email। मुझे देखकर आश्चर्य नहीं होगा GET /users/id/{id}, या तो (हालांकि मेरी राय में, यह बेमानी है)।

अन्य दृष्टिकोणों पर टिप्पणियाँ

  1. GET /users/id={id} GET /users/email={email}
    • मुझे नहीं लगता कि मैंने इसे देखा है, और अगर मैंने इसे देखा, तो यह बहुत भ्रामक होगा। यह लगभग ऐसा है जैसे यह पथ मापदंडों के साथ क्वेरी मापदंडों की नकल करने की कोशिश कर रहा है।
  2. GET /users?id={id} GET /users?email={email}
    • मुझे लगता है कि जब आपने फ़िल्टरिंग के लिए क्वेरी पैरामीटर का उपयोग किया था, तो आपने सिर पर कील ठोक दी थी।
    • यह कभी के साथ इस संसाधन कॉल करने के लिए फ़ायदेमंद होगा दोनों एक idऔर एक email(जैसे GET /users?id={id}&email={email})? यदि नहीं, तो मैं इस तरह एकल संसाधन विधि का उपयोग नहीं करूंगा।
    • मैं फ़िल्टरिंग के लिए वैकल्पिक क्वेरी मापदंडों के साथ उपयोगकर्ताओं की सूची को पुनर्प्राप्त करने के लिए इस विधि की अपेक्षा करूंगा , लेकिन मैं मापदंडों के बीच होने की उम्मीद नहीं करूंगा id, emailया किसी विशिष्ट पहचानकर्ता के साथ। उदाहरण के लिए: GET /users?status=BANNEDप्रतिबंधित उपयोगकर्ताओं की सूची वापस कर सकते हैं।

की जाँच करें इस जवाब एक संबंधित सवाल से।


इनपुट के लिए धन्यवाद। वास्तव में आप सही हैं। ऐसा लगता है जैसे मैंने "जंगेस्ट-जावा के साथ रैस्टफुल जावा" किताब में # 1 पढ़ा है लेकिन कुछ हद तक संदर्भ से बाहर है। लेकिन मुझे यह स्पष्ट रूप से पढ़ना याद है कि स्टैकओवरफ़्लो पर एक प्रश्न के उत्तर के रूप में (मुझे विश्वास है कि जब मैं कहता हूं कि मैं अपने सहयोगियों को भी साबित करने के लिए उस लिंक को खोजने की बहुत कोशिश कर रहा हूं :)) और # 2 बिल्कुल वही है जो मैं था की तलाश में डिजाइन पर कुछ प्रतिक्रिया। धन्यवाद!
शशि 15

पुनश्च: मुझे यकीन नहीं है कि यह पोस्ट करना यहां नियम के खिलाफ है लेकिन आप शायद मेरे अन्य प्रश्नों में से किसी एक पर कुछ प्रकाश डाल सकते हैं? कृप्या? :) stackoverflow.com/questions/20508008/…
shahshi15

के लिए अपने बयान के बारे में स्पष्ट करने के लिए /users/id/{id}, यह विस्तारित कार्यक्षमता के लिए अनुमति देता है, बस कई पहचानकर्ताओं (आईडी, गाइड, नाम) के माध्यम से एक संसाधन का उपयोग करने की अनुमति देता है। यहाँ
डैनियल डुबोव्स्की

4
मेरा उत्तर यह होगा कि किसी विशिष्ट उपयोगकर्ता को उदाहरण के लिए उपयुक्त तरीका / उपयोगकर्ता / {आईडी} होगा। यदि आप उपयोगकर्ताओं को किसी विशेष ईमेल पते द्वारा खोजना चाहते हैं, जो उन उपयोगकर्ताओं के लिए विशिष्ट पहचानकर्ता नहीं है जो मैं / उपयोगकर्ता करूंगा; तो ईमेल = {ईमेल} चूंकि यह उपयोगकर्ताओं के संग्रह को फ़िल्टर करने का एक तरीका है, न कि इसके संसाधन द्वारा एक विशिष्ट संसाधन की पहचान करना। पहचानकर्ता के रूप में / उपयोगकर्ताओं / {आईडी} है।
केविन एम

बहुत बढ़िया जवाब! इसके लिए थम्सअप। केवल एक चीज जो मैं करने की सलाह दूंगा वह यह है कि अपने एपीआई को थोड़ा बदलना होगा क्योंकि REST नाम-केंद्रित होना चाहिए ताकि आपके संसाधन मैपिंग कुछ इस तरह हों: GET /user/1234और नहींGET /users/123
सैमी

38

इस व्यावहारिक रूप से देखते हुए, आपको उपयोगकर्ताओं का एक संग्रह मिला है:

/users   # this returns many

प्रत्येक उपयोगकर्ता के पास एक समर्पित संसाधन स्थान है:

/users/{id}    # this returns one

आपको उपयोगकर्ताओं की खोज करने के कई तरीके भी मिले हैं:

/users?email={email}
/users?name=*bob*

चूंकि ये सभी / उपयोगकर्ताओं के लिए क्वेरी पैरामीटर हैं, इसलिए उन्हें सभी सूची वापस करनी चाहिए .. भले ही यह 1 की सूची हो।

मैंने यहाँ व्यावहारिक रेस्टफुल एपीआई डिज़ाइन पर एक ब्लॉग पोस्ट लिखी है जो इस बारे में, अन्य चीजों के बारे में, यहाँ पर बात करती है: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api


उत्तर के लिए धन्यवाद विनय। लेकिन अगर हम इसे दूसरे परिप्रेक्ष्य में सोचते हैं, तो {आईडी} की तरह {ईमेल} हमेशा एक परिणाम वापस करने जा रहा है। यदि हम वास्तव में खोज रहे हैं, तो ईमेल के लिए आईडी = {आईडी} का उपयोग क्यों नहीं किया जाता है? मैं सोच रहा था कि क्या कोई संगत है। पुनश्च: स्टैकओवरफ्लो के लिए नया, पता नहीं था कि मैं केवल एक ही उत्तर दे सकता हूं। लेकिन आपके उत्तर के लिए धन्यवाद! इसकी प्रशंसा करना। हो सकता है कि आप इसके साथ मेरी भी मदद कर सकें: stackoverflow.com/questions/20508008/…
shahshi15

7
यह वह जगह है जहां एपीआई डिजाइन का "डिजाइन" पहलू खेल में आता है। आपके संसाधन में एक समर्पित स्थान होना चाहिए। स्थान कहाँ है? क्या आईडी द्वारा स्थान है? यदि ऐसा है, तो आप आईडी द्वारा "खोज" नहीं करते हैं, आप आईडी द्वारा "प्राप्त" करते हैं। लेकिन तुम सब कुछ खोजते हो। बेशक, यहाँ कोई कठिन नियम नहीं है। यह सिर्फ एक परिप्रेक्ष्य है :)
विनय साहनी

6
मैं यह भी तर्क दूंगा कि आपका एपीआई अधिक स्थिर है। आप वास्तव में जानते हैं कि आपकी आईडी अद्वितीय है लेकिन क्या आप वास्तव में ईमेल पते के बारे में निश्चित हैं? यहां तक ​​कि अगर यह अद्वितीय है तो शायद यह स्थायी नहीं है क्योंकि उपयोगकर्ता इसे बदल सकता है। तो / उपयोगकर्ता? ईमेल = {ईमेल} यह स्पष्ट करता है कि यह वास्तव में एक क्वेरी है और एक परमिट पहचानकर्ता के साथ संसाधन तक पहुंच नहीं है।
lex82

मेरा मानना ​​है कि यह वास्तव में अधिक सही उत्तर है। ईमेल पते द्वारा संग्रह को फ़िल्टर करना वाइल्डकार्ड आधारित हो सकता है इसलिए यह हमेशा केवल एक परिणाम नहीं देगा।
केविन एम

@VinaySahni जैसे पैटर्न के बारे में आप क्या कहेंगे: /user?by=email&email="abc@pqr.com "/ user? By = id & id =" xashkhx "/ users? FilterA =" a "& filterB =" b "(बहुवचन) कई उपयोगकर्ताओं के लिए)
Shasak

2

उपयोगकर्ता संसाधनों के बारे में

पथ पर /usersआपको हमेशा लौटाए गए उपयोगकर्ता संसाधनों का संग्रह मिलेगा।

रास्ते में /users/[user_id]आप कई चीजें होने की उम्मीद कर सकते हैं:

  1. आपको अपने पहचानकर्ता [user_id] या के साथ उपयोगकर्ता संसाधन का प्रतिनिधित्व करने वाला एक सिंगलटन संसाधन प्राप्त करना चाहिए
  2. यदि कोई उपयोगकर्ता आईडी [user_id] मौजूद है या नहीं तो 404 प्रतिसाद नहीं मिला है
  3. निषिद्ध 401 यदि आपको अनुरोधित उपयोगकर्ता संसाधन तक पहुंचने की अनुमति नहीं है।

प्रत्येक सिंगलटन अपने पथ और पहचानकर्ता द्वारा विशिष्ट रूप से पहचाना जाता है और आप संसाधन खोजने के लिए इनका उपयोग करते हैं। सिंगलटन के लिए कई रास्तों का उपयोग करना संभव नहीं है।

आप /usersक्वेरी पैरामीटर ( GETपैरामीटर) के साथ पथ को क्वेरी कर सकते हैं । यह अनुरोधित मानदंडों को पूरा करने वाले उपयोगकर्ताओं के साथ एक संग्रह लौटाएगा। संग्रह जो लौटाया जाता है, उसमें उपयोगकर्ता संसाधन शामिल होने चाहिए, सभी प्रतिक्रिया में उनके संसाधन पथ की पहचान करते हैं।

पैरामीटर संग्रह के संसाधनों में मौजूद कोई भी क्षेत्र हो सकता है; firstName, lastName,id

ईमेल के बारे में

ईमेल या तो एक संसाधन या उपयोगकर्ता संसाधन की एक संपत्ति / क्षेत्र हो सकता है।

- उपयोगकर्ता की संपत्ति के रूप में ईमेल करें:

यदि फ़ील्ड उपयोगकर्ता की एक संपत्ति है तो उपयोगकर्ता की प्रतिक्रिया कुछ इस तरह दिखाई देगी:

{ 
  id: 1,
  firstName: 'John'
  lastName: 'Doe'
  email: 'john.doe@example.com'
  ...
}

इसका मतलब है कि ईमेल के लिए कोई विशेष समापन बिंदु नहीं है, लेकिन अब आप निम्नलिखित अनुरोध भेजकर एक उपयोगकर्ता को इसके ईमेल से पा सकते हैं /users?email=john.doe@example.com:। कौन से (ईमेल उपयोगकर्ताओं के लिए अद्वितीय हैं) ईमेल से मेल खाने वाले एक उपयोगकर्ता आइटम के साथ एक संग्रह लौटाएगा।

- संसाधन के रूप में ईमेल करें:

लेकिन अगर उपयोगकर्ताओं के ईमेल भी संसाधन हैं। तब आप एक एपीआई बना सकते हैं, /users/[user_id]/emailsजिसमें आईडी के साथ उपयोगकर्ता के लिए ईमेल पतों का संग्रह होता है user_id/users/[user_id]/emails/[email_id]user_id और ['email_id'] के साथ उपयोगकर्ता का ईमेल लौटाता है। एक पहचानकर्ता के रूप में आप जो भी उपयोग करते हैं, वह आपके ऊपर है, लेकिन मैं एक पूर्णांक से चिपक जाता हूं। DELETEजिस पथ को आप हटाना चाहते हैं, उस ईमेल को पहचानने का अनुरोध करके आप उपयोगकर्ता से एक ईमेल हटा सकते हैं। उदाहरण के लिए तो DELETEपर /users/[user_id]/emails/[email_id]EMAIL_ID कि user_id के साथ उपयोगकर्ता के स्वामित्व में है के साथ ईमेल को नष्ट करेगा। सबसे अधिक संभावना केवल यह है कि उपयोगकर्ता इस डिलीट ऑपरेशन को करने की अनुमति देता है। अन्य उपयोगकर्ताओं को 401 की प्रतिक्रिया मिलेगी।

यदि उपयोगकर्ता के पास केवल एक ईमेल पता हो सकता है, तो आप /users/[user_id]/email इस रिटर्न को सिंगलटन संसाधन से चिपका सकते हैं । उपयोगकर्ता PUTउस यूआरएल पर ईमेल पते को टिंग करके अपना ईमेल पता अपडेट कर सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.