सबसे अच्छा / आम Restful url verbs और क्रियाएं क्या हैं?


86

मैं सबसे अच्छी और सबसे आम RESTful url क्रियाओं के बारे में कुछ जानकारी खोजने की कोशिश कर रहा हूं।

उदाहरण के लिए, किसी आइटम का विवरण प्रदर्शित करने, आइटम को संपादित करने, अद्यतन करने आदि के लिए आप किस यूआरएल का उपयोग करते हैं

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

हम्म। किसी की मदद करने के लिए धन्यवाद :)

जवाबों:


173

अपनी वस्तुओं को निर्दिष्ट करने के लिए URL का उपयोग करें, न कि आपके कार्यों के लिए:

ध्यान दें कि आपने पहली बार जो उल्लेख किया है वह RESTful नहीं है:

/questions/show/<whatever>

इसके बजाय, आपको अपनी वस्तुओं को निर्दिष्ट करने के लिए अपने URL का उपयोग करना चाहिए:

/questions/<question>

फिर आप उस संसाधन पर नीचे दिए गए कार्यों में से एक का प्रदर्शन करते हैं।


प्राप्त:

एक संसाधन प्राप्त करने के लिए उपयोग किया जाता है, संसाधनों की एक सूची को क्वेरी करें, और एक संसाधन पर केवल-पढ़ने के लिए जानकारी को क्वेरी करने के लिए भी।

प्रश्न संसाधन प्राप्त करने के लिए:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

सभी प्रश्न संसाधनों को सूचीबद्ध करने के लिए:

GET /questions HTTP/1.1
Host: whateverblahblah.com

पद:

एक संसाधन बनाने के लिए उपयोग किया जाता है।

ध्यान दें कि निम्नलिखित त्रुटि है:

POST /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

यदि URL अभी तक नहीं बना है, तो आपको नाम निर्दिष्ट करते समय इसे बनाने के लिए POST का उपयोग नहीं करना चाहिए। इसके परिणामस्वरूप संसाधन में त्रुटि नहीं मिली क्योंकि यह अभी तक मौजूद नहीं है। आपको सर्वर पर संसाधन को पहले रखना चाहिए। आप यह तर्क दे सकते हैं कि एक नया प्रश्न बनाकर, आप / प्रश्न संसाधन को भी अपडेट कर रहे हैं क्योंकि यह अब इसके प्रश्नों की सूची में एक और प्रश्न लौटाएगा।

POST का उपयोग करके संसाधन बनाने के लिए आपको कुछ इस तरह करना चाहिए:

POST /questions HTTP/1.1
Host: whateverblahblah.com

ध्यान दें कि इस स्थिति में संसाधन का नाम निर्दिष्ट नहीं है, नई ऑब्जेक्ट URL पथ आपके पास वापस आ जाएगी।

हटाएँ:

संसाधन को हटाने के लिए उपयोग किया जाता है।

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

डाल:

संसाधन बनाने के लिए उपयोग किया जाता है, या जब आप संसाधन URL निर्दिष्ट करते हैं, तो इसे अधिलेखित कर देते हैं।

एक नए संसाधन के लिए:

PUT /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

मौजूदा संसाधन को अधिलेखित करने के लिए:

PUT /questions/<existing_question> HTTP/1.1
Host: whateverblahblah.com

... हां, वही हैं। PUT को अक्सर 'एडिट' विधि के रूप में वर्णित किया जाता है, जैसा कि पूरे संसाधन को थोड़े परिवर्तित संस्करण के साथ बदलकर, आपने संपादित किया है कि जब वे अगले काम करेंगे तो ग्राहक क्या प्राप्त करेंगे।


HTML फॉर्म में REST का उपयोग करना:

एचटीएमएल 5 कल्पना परिभाषित करता है प्राप्त और फार्म तत्व के लिए पोस्ट

विधि सामग्री विशेषता निम्नलिखित कीवर्ड और राज्यों के साथ एक एनुमिटेड विशेषता है:

  • कीवर्ड GET, राज्य GET के लिए मैपिंग, HTTP GET विधि को दर्शाता है।
  • कीवर्ड POST, राज्य POST के लिए मैपिंग, HTTP POST विधि को दर्शाता है।

तकनीकी रूप से, HTTP विनिर्देश आपको केवल उन विधियों तक सीमित नहीं करता है। आप किसी भी तरीके को जोड़ने के लिए तकनीकी रूप से स्वतंत्र हैं, हालांकि व्यवहार में, यह एक अच्छा विचार नहीं है। विचार यह है कि हर कोई जानता है कि आप डेटा को पढ़ने के लिए GET का उपयोग करते हैं, इसलिए यह उन मामलों को भ्रमित करेगा यदि आप इसके बजाय READ का उपयोग करने का निर्णय लेते हैं। ने कहा कि...

PATCH:

यह एक विधि है जिसे एक औपचारिक आरएफसी में परिभाषित किया गया था। इसका उपयोग तब किया जाता है जब आप किसी संसाधन में सिर्फ एक आंशिक संशोधन भेजना चाहते हैं, इसका उपयोग PUT की तरह किया जाएगा:

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

अंतर यह है कि PUT को पूरे संसाधन को भेजना पड़ता है, चाहे वह वास्तव में बदले जाने वाले की तुलना में कितना ही बड़ा क्यों न हो, PATCH के अनुसार आप केवल बदलाव भेज सकते हैं।


हाय ब्रायन .. जितना अधिक मैं इसे पढ़ता हूं, उतना ही यह सेंस बनाता है। मैं मान रहा हूं कि कुछ ब्राउज़र (या ब्राउज़र संस्करण) PUT या DELETE का समर्थन नहीं करते हैं? अगर ऐसा है, तो क्या हम इसके बजाय POST का उपयोग करते हैं?
शुद्ध। क्रोम

1
हाय प्योर.नोम; वेब ब्राउज़र उन सभी का समर्थन करते हैं, साथ ही किसी भी HTTP पुस्तकालय को उन सभी का भी समर्थन करना चाहिए।
ब्रायन आर। बॉन्डी

4
मैं जिस तरह से इस पुस्तक खरीदने की सिफारिश करेंगे अगर आप बाकी के बारे में सभी सीखना चाहते oreilly.com/catalog/9780596529260
ब्रायन आर Bondy

1
@ ब्रायन: आपके PUT उदाहरणों के बारे में कुछ और सवाल। >> PUT / questions / <new_question> आप ऐसा क्यों करेंगे, इसके बजाय >> PUT / questions / क्योंकि फॉर्म में सभी डेटा का उपयोग नए संसाधन बनाने के लिए किया जाएगा? (अगली टिप्पणी जारी रखी ...)
Pure.Krome

1
@ ब्रायन आर बॉडी, आपके शानदार जवाब के लिए धन्यवाद। मौजूदा संसाधन के लिए POST के अनुरोध को आपके सामान्य "संशोधित" शब्द के विपरीत, ओविली की बाकी किताब (पृष्ठ: 100,101) में "संलग्न" के रूप में वर्णित किया गया है। आखिरकार, परिशिष्ट संशोधित करने की तुलना में अधिक विशिष्ट है - जो "एक मौजूदा संसाधन के लिए पुट" को सूचित कर सकता है - और शब्दार्थ POST के लिए अधिक सही लगता है - निर्दिष्ट लिंक पर नए संसाधन को जोड़ना, या तो बाल संसाधन को जोड़ना या बनाना। ।
.zgür

11

मान /questions/10लेना एक वैध प्रश्न है तो विधि का उपयोग इसके साथ बातचीत करने के लिए किया जाता है।

इसे जोड़ने के लिए पोस्ट

इसे बनाने या बदलने के लिए PUT करें

इसे देखने / क्वेरी करने के लिए प्राप्त करें

और अच्छी तरह से DELETE करें .. इसे हटा दें।

Url नहीं बदलता है।


4
गलत। PUT को बेरोजगार होना चाहिए। आप पहली बार के बाद कोई प्रभाव नहीं, कई बार एक ही PUT अनुरोध करने में सक्षम होना चाहिए। इसलिए, हर PUT रिक्वेस्ट के साथ एक रिसोर्स बनाना बेमानी नहीं है।
ऐहलके

3
"विधियाँ PUT और DELETE को निरर्थक के रूप में परिभाषित किया गया है, जिसका अर्थ है कि एकाधिक समान अनुरोधों का एक ही अनुरोध एक ही प्रभाव होना चाहिए।", एक URI में पुट का उपयोग करके जो वर्तमान में संसाधन उपलब्ध नहीं कराता है, एक रिसोर्स बना सकता है। तुरंत PUTting फिर से बस फिर से करना होगा जिसका कोई प्रभाव नहीं होगा। इस तरह आप एक संसाधन बना रहे हैं, लेकिन क्वेरी अभी भी उदासीन है। यदि आप बाद में वापस आते हैं और संसाधन को बदलना चाहते हैं, तो आप एक ही URI को अलग-अलग डेटा (जो एक अलग अनुरोध होगा और एक ही परिणाम के साथ किसी भी समय खुद को दोहराया जा सकता है) को PUT करते हैं।
एलन लालोंडे

1
वास्तव में, उस उत्तर पर एक नज़र डालें, जिसके ऊपर 25 मत मिले थे, जिसमें कहा गया था कि PUT का उपयोग संसाधन बनाने या बदलने के लिए किया जा सकता है।
Allain Lalonde

3
निर्माण केवल तब तक काम करता है जब तक कि एक नए संसाधन की आईडी को निर्दिष्ट करने की अनुमति है। जबकि यह संभव है, यह उपयोगकर्ता के लिए POST / संग्रह के लिए अधिक बार
आश्वस्त होता है

2
@aehIke PUT द्वारा एक नए संसाधन का निर्माण गैर-बेरोजगार नहीं है क्योंकि यह विचार है कि अगर मैं 'PUT / आइटम / 10' और आइटम 10 पहले से मौजूद नहीं था, तो यह सिर्फ बनाया जाएगा। हालाँकि, अगर मैं दूसरी बार फिर से 'PUT / items / 10' ले रहा हूँ, तो अब यह पहले से ही मौजूद है, इसलिए इसे अभी बदल दिया जाएगा, क्योंकि बाद में PUT अनुरोधों का कोई नया साइड इफेक्ट नहीं होने के कारण idempotence संरक्षित है। (निश्चित रूप से यह मानते हुए कि मैं हर बार एक ही सटीक वस्तु
रखता हूं

3

मैं एक अंग पर बाहर जा रहा हूं और अनुमान लगाता हूं कि आपके मतलब के एमवीसी के लिए मानक नियंत्रक क्या हैं जब आप "रेस्टफुल" कहते हैं, क्योंकि आपके उदाहरणों को गैर- "रेस्टफुल" माना जा सकता है ( इस लेख को देखें)।

चूंकि रेल वास्तव में आपके द्वारा रुचि रखने वाली URL शैली को लोकप्रिय बनाती है, मैं रूबी में रूबी में ScaffoldingGenerator द्वारा निर्मित डिफ़ॉल्ट नियंत्रक क्रियाओं के नीचे प्रस्तुत करता हूं । रेल एप्लिकेशन का उपयोग करके किसी को भी इनसे परिचित होना चाहिए।

स्कैफोल्ड किए गए कार्य और दृश्य हैं: सूचकांक, सूची, शो, नया, बनाना, संपादित करना, अपडेट करना, नष्ट करना

आमतौर पर आप इसका निर्माण इस प्रकार करेंगे:

http://application.com/controller/<action>/<id>

5
आउट-ऑफ-बैंड यूआरआई कन्वेंशन रेस्टफुल नहीं हैं। स्वयं को उद्धृत करते हुए: "एक REST API को निश्चित संसाधन नामों या पदानुक्रमों (क्लाइंट और सर्वर का एक स्पष्ट युग्मन) को परिभाषित नहीं करना चाहिए। सर्वर को अपने स्वयं के नामस्थान को नियंत्रित करने की स्वतंत्रता होनी चाहिए। इसके बजाय, सर्वरों को उपयुक्त URI का निर्माण करने के लिए ग्राहकों को निर्देश देने की अनुमति दें। , जैसे कि HTML रूपों और URI टेम्प्लेट में किया जाता है, मीडिया प्रकारों और लिंक संबंधों के भीतर उन निर्देशों को परिभाषित करके .. "
aehlke

1

यहां REST सिद्धांत का उपयोग करते हुए आपके वर्तमान URL की मैपिंग है:

/question/show/<whatever>

यदि आप प्रश्न को संसाधन के रूप में पहचानते हैं, तो उसके पास एक विशिष्ट URL होना चाहिए। इसे प्रदर्शित करने के लिए GET का उपयोग करना (इसे पुनः प्राप्त करना) सामान्य अभ्यास है। यह हो जाता है:

GET /question/<whatever>

/question/edit/<whatever>

अब आप चाहते हैं कि आपके उपयोगकर्ता के पास उसी संसाधन का एक और दृश्य हो जो उसे संसाधन को संपादित करने की अनुमति देता है (हो सकता है कि प्रपत्र नियंत्रण के साथ)।

यहां दो विकल्प, आपका एप्लिकेशन एक एप्लिकेशन है (वेबसाइट नहीं), तो आप क्लाइंट पक्ष में संसाधन को एक संपादन योग्य संसाधन में बदलने के लिए जावास्क्रिप्ट का उपयोग कर बेहतर हो सकते हैं।

यदि यह एक वेबसाइट है, तो आप किसी अन्य दृश्य को निर्दिष्ट करने के लिए अतिरिक्त जानकारी के साथ एक ही URL का उपयोग कर सकते हैं, सामान्य अभ्यास लगता है:

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

यह प्रश्न बदलना है, इसलिए PUT उपयोग करने की सही विधि है:

PUT /question/<whatever>

/question/list   (lists the questions)

प्रश्न की सूची वास्तव में प्रश्न का मूल संसाधन है, इसलिए यह स्वाभाविक रूप से है:

GET /question

अब आपको कुछ और की आवश्यकता हो सकती है:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

टाडा :)


-1

आपके चार उदाहरण हो सकते हैं:

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

प्रश्न जोड़ने के लिए:

POST /questions q=What+is+the+meaning+of+life

सर्वर जवाब देगा:

200 OK (or 201 Created)
Location: /questions/456
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.