REST को समझना: क्रिया, त्रुटि कोड और प्रमाणीकरण


602

मैं अपने PHP- आधारित वेब एप्लिकेशन, डेटाबेस और CMS में डिफ़ॉल्ट फ़ंक्शंस के आसपास एपीआई को लपेटने का एक तरीका ढूंढ रहा हूं।

मैंने चारों ओर देखा है और कई "कंकाल" ढांचे पाए हैं। मेरे प्रश्न के उत्तर के अलावा, टॉनिक है , एक REST फ्रेमवर्क मुझे पसंद है क्योंकि यह बहुत हल्का है।

मुझे इसकी सादगी के लिए REST सबसे अच्छा लगता है, और इसके आधार पर एक API आर्किटेक्चर बनाना चाहूंगा। मैं मूल सिद्धांतों के आसपास अपना सिर लाने की कोशिश कर रहा हूं और अभी तक इसे पूरी तरह से समझ नहीं पाया हूं। इसलिए, कई सवाल।

1. क्या मैं इसे सही समझ रहा हूँ?

कहें कि मेरे पास एक संसाधन है "उपयोगकर्ता"। मैं इस तरह से कई URI सेट कर सकता था:

/api/users     when called with GET, lists users
/api/users     when called with POST, creates user record
/api/users/1   when called with GET, shows user record
               when called with PUT, updates user record
               when called with DELETE, deletes user record

क्या यह एक सही वास्तुकला का अब तक का सही प्रतिनिधित्व है?

2. मुझे और अधिक क्रियाएं चाहिए

सिद्धांत रूप में बनाएं, अपडेट और हटाएं पर्याप्त हो सकते हैं, लेकिन व्यवहार में मुझे बहुत अधिक क्रियाओं की आवश्यकता होगी। मुझे लगता है कि ये ऐसी चीजें हैं जिन्हें एक अद्यतन अनुरोध में एम्बेड किया जा सकता है, लेकिन वे विशिष्ट क्रियाएं हैं जिनमें विशिष्ट रिटर्न कोड हो सकते हैं और मैं उन सभी को एक कार्रवाई में नहीं फेंकना चाहूंगा।

उपयोगकर्ता के मन में आने वाले कुछ उदाहरण हैं:

activate_login
deactivate_login
change_password
add_credit

मैं RESTful URL आर्किटेक्चर में उन कार्यों को कैसे व्यक्त करूंगा?

मेरी वृत्ति जैसे URL के लिए GET कॉल करना होगा

/api/users/1/activate_login 

और एक स्थिति कोड वापस पाने की अपेक्षा करें।

यह HTTP क्रियाओं के उपयोग के विचार से भटक जाता है, हालांकि। तुम क्या सोचते हो?

3. एरर मैसेज और कोड कैसे लौटाएं

REST की सुंदरता का एक बड़ा हिस्सा मानक HTTP विधियों के उपयोग से उपजा है। एक त्रुटि पर, मैं 3xx, 4xx या 5xx त्रुटि स्थिति कोड के साथ एक हेडर का उत्सर्जन करता हूं। एक विस्तृत त्रुटि विवरण के लिए, मैं शरीर (दाएं?) का उपयोग कर सकता हूं। अब तक सब ठीक है। लेकिन एक स्वामित्व त्रुटि कोड को प्रसारित करने का तरीका क्या होगा जो यह बताने में अधिक विस्तृत है कि क्या गलत हुआ (जैसे "डेटाबेस से कनेक्ट करने में विफल", या "डेटाबेस लॉगिन गलत")? यदि मैं संदेश के साथ इसे शरीर में डालता हूं, तो मुझे इसे बाद में पार्स करना होगा। क्या इस तरह की चीज के लिए एक मानक शीर्षलेख है?

4. प्रमाणीकरण कैसे करें

  • REST सिद्धांतों के बाद API कुंजी आधारित प्रमाणीकरण क्या होगा?
  • जब एक REST ग्राहक को प्रमाणित करने के लिए सत्र का उपयोग करने के खिलाफ मजबूत बिंदु होते हैं, तो इसके अलावा यह REST सिद्धांत का एक धूर्त उल्लंघन है? :) (केवल आधा मज़ाक यहाँ, सत्र आधारित प्रमाणीकरण मेरे मौजूदा बुनियादी ढांचे के साथ अच्छा खेलेगा।)

13
@ डैनियल, संपादन के लिए धन्यवाद। "मैं और अधिक क्रियाएं" एक जानबूझकर दंड था, लेकिन मैं इसे छोड़ रहा हूं, अब पढ़ना आसान है। :)
पेका

1
BTW, त्रुटि विवरण के बारे में। मैं प्रतिक्रिया के हेडर में त्रुटि विवरण डालने के साथ समाप्त हुआ। बस 'त्रुटि विवरण' नाम का हेडर जोड़ें।
एंड्री मुजिकुक

यह एप्लिकेशन सुरक्षा प्रश्नों की तरह दिखता है। अनुप्रयोग सुरक्षा REST के बारे में नहीं है।
नजर मेरजा

@NazarMerza कैसे हैं 1., 2. और 3. अनुप्रयोग सुरक्षा प्रश्न?
पेका

जवाबों:


620

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


बिंदु 1: क्या मैं इसे सही समझ रहा हूँ?

आपने सही समझा। यह एक Restful वास्तुकला का एक सही प्रतिनिधित्व है। आपको अपनी संज्ञा और क्रिया को परिभाषित करने में विकिपीडिया से निम्न मैट्रिक्स बहुत मददगार मिल सकता है :


जब एक संग्रह URI के साथ काम कर रहा है जैसे:http://example.com/resources/

  • GET : संग्रह के सदस्यों की सूची, आगे के नेविगेशन के लिए अपने सदस्य URI के साथ पूर्ण करें। उदाहरण के लिए, बिक्री के लिए सभी कारों को सूचीबद्ध करें।

  • PUT : जिसका अर्थ है "पूरे संग्रह को दूसरे संग्रह से प्रतिस्थापित करें"।

  • POST : संग्रह में एक नई प्रविष्टि बनाएँ जहाँ ID संग्रह द्वारा स्वचालित रूप से असाइन किया गया है। बनाई गई आईडी को आमतौर पर इस ऑपरेशन द्वारा लौटाए गए डेटा के हिस्से के रूप में शामिल किया जाता है।

  • DELETE : "संपूर्ण संग्रह हटाएं" के रूप में परिभाषित अर्थ।


जब एक सदस्य URI के साथ काम करते हैं जैसे:http://example.com/resources/7HOU57Y

  • GET : उचित MIME प्रकार में व्यक्त संग्रह के संबोधित सदस्य का प्रतिनिधित्व प्राप्त करें

  • PUT : संग्रह के संबोधित सदस्य को अपडेट करें या निर्दिष्ट आईडी के साथ बनाएं।

  • POST : संबोधित सदस्य को अपने आप में एक संग्रह के रूप में मानता है और इसका एक नया अधीनस्थ बनाता है।

  • DELETE : संग्रह के संबोधित सदस्य को हटाएं।


बिंदु 2: मुझे और क्रियाओं की आवश्यकता है

सामान्य तौर पर, जब आपको लगता है कि आपको अधिक क्रियाओं की आवश्यकता है, तो इसका वास्तव में मतलब हो सकता है कि आपके संसाधनों को फिर से पहचानने की आवश्यकता है। याद रखें कि REST में आप हमेशा किसी संसाधन पर, या संसाधनों के संग्रह पर कार्य कर रहे हैं। आप जो भी संसाधन चुनते हैं, वह आपके एपीआई परिभाषा के लिए काफी महत्वपूर्ण है।

सक्रिय / निष्क्रिय करें लॉगिन : यदि आप एक नया सत्र बना रहे हैं, तो आप संसाधन के रूप में "सत्र" पर विचार करना चाह सकते हैं। एक नया सत्र बनाने के लिए, http://example.com/sessions/शरीर में साख के साथ POST का उपयोग करें । इसे समाप्त करने के लिए PUT या DELETE का उपयोग करें (शायद इस बात पर निर्भर करता है कि आप सत्र इतिहास रखने का इरादा रखते हैं) http://example.com/sessions/SESSION_ID

पासवर्ड बदलें: इस बार संसाधन "उपयोगकर्ता" है। आपको http://example.com/users/USER_IDशरीर में पुराने और नए पासवर्ड के साथ एक PUT की आवश्यकता होगी । आप "उपयोगकर्ता" संसाधन पर कार्य कर रहे हैं, और एक परिवर्तन पासवर्ड बस एक अद्यतन अनुरोध है। यह रिलेशनल डेटाबेस में UPDATE स्टेटमेंट के समान है।

मेरी वृत्ति जैसे URL के लिए GET कॉल करना होगा /api/users/1/activate_login

यह एक बहुत ही मुख्य REST सिद्धांत के खिलाफ जाता है: HTTP क्रियाओं का सही उपयोग। किसी भी GET अनुरोध को कभी भी कोई दुष्प्रभाव नहीं छोड़ना चाहिए।

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


बिंदु 3: त्रुटि संदेश और कोड कैसे लौटाएं

त्रुटि श्रेणियों के रूप में 4xx या 5xx HTTP स्थिति कोड पर विचार करें। आप शरीर में त्रुटि को विस्तृत कर सकते हैं।

डेटाबेस से कनेक्ट करने में विफल: / गलत डेटाबेस लॉगिन : सामान्य तौर पर आपको इस प्रकार की त्रुटियों के लिए 500 त्रुटि का उपयोग करना चाहिए। यह एक सर्वर-साइड त्रुटि है। क्लाइंट ने कुछ भी गलत नहीं किया। 500 त्रुटियों को आम तौर पर "वापस लेने योग्य" माना जाता है। यानी क्लाइंट उसी सटीक अनुरोध को पुनः प्राप्त कर सकता है, और सर्वर की परेशानी हल होने के बाद उसके सफल होने की उम्मीद करता है। विवरण को शरीर में निर्दिष्ट करें, ताकि ग्राहक हमारे लिए कुछ संदर्भ प्रदान कर सके।

त्रुटियों की अन्य श्रेणी 4xx परिवार होगी, जो सामान्य रूप से संकेत देती है कि ग्राहक ने कुछ गलत किया था। विशेष रूप से, त्रुटियों की यह श्रेणी सामान्य रूप से क्लाइंट को संकेत देती है कि अनुरोध को फिर से लेने की आवश्यकता नहीं है, क्योंकि यह स्थायी रूप से विफल होता रहेगा। अर्थात ग्राहक को इस अनुरोध को पुनः प्राप्त करने से पहले कुछ बदलने की आवश्यकता है। उदाहरण के लिए, "संसाधन नहीं मिला" (HTTP 404) या "विकृत अनुरोध" (HTTP 400) त्रुटियां इस श्रेणी में आएंगी।


अंक 4: प्रमाणीकरण कैसे करें

जैसा कि बिंदु 1 में बताया गया है, एक उपयोगकर्ता को प्रमाणित करने के बजाय, आप एक सत्र बनाने के बारे में सोचना चाह सकते हैं। आपको उचित HTTP स्थिति कोड (200: एक्सेस दी गई या 403: एक्सेस अस्वीकृत) के साथ एक नया "सत्र आईडी" लौटाया जाएगा।

फिर आप अपने RESTful सर्वर से पूछेंगे: "क्या आप मुझे इस सत्र ID के लिए संसाधन प्राप्त कर सकते हैं?"।

कोई प्रमाणित मोड नहीं है - REST स्टेटलेस है: आप एक सत्र बनाते हैं, आप सर्वर से इस सत्र आईडी का उपयोग करते हुए आपको एक पैरामीटर के रूप में संसाधन देने के लिए कहते हैं, और लॉगआउट करने पर आप सत्र को छोड़ देते हैं या समाप्त कर देते हैं।


6
बहुत अच्छा है, हालाँकि PUTपासवर्ड बदलने के लिए आपका उपयोग शायद गलत है; PUTसंपूर्ण संसाधन की आवश्यकता है, इसलिए आपको HTTP (और इसलिए HATEOAS REST के साथ) के अनुपालन के लिए सभी उपयोगकर्ता विशेषताओं को भेजना होगा। बल्कि, बस पासवर्ड को बदलने के लिए एक का उपयोग करना चाहिए PATCHया POST
लॉरेंस डोल

1
मुझे लगता है कि अगर आप "POST:" पर एक अधिक संग्रह के रूप में संबोधित सदस्य को मानते हैं और इसका एक नया अधीनस्थ बनाता है, तो यह पोस्ट सही होगी। माध्यम। - मैंने पाया कि इसका Googling से क्या तात्पर्य है - यह आपके अन्यथा महान जवाब का अपवाद है।
मार्टिन कोंकणी

6
मैं बहुत अंतिम वाक्य से सहमत नहीं हूं। आप बता रहे हैं कि REST कैसे स्टेटलेस होता है। एक सत्र बनाने के लिए लॉग इन करना, फिर कुछ काम करने के बाद सत्र को समाप्त करने के लिए लॉग आउट करना एक स्टेटफुल एपीआई का सबसे अच्छा उदाहरण है।
ब्रैंडन

1
"यह एक बहुत ही मुख्य REST सिद्धांत के खिलाफ जाता है: HTTP क्रियाओं का सही उपयोग। किसी भी GET अनुरोध को कभी भी कोई दुष्प्रभाव नहीं छोड़ना चाहिए।" - क्या होगा अगर आप संसाधन के लिए एक हिट गिनती बनाए रखना चाहते हैं?
बॉबीलेक्स

1
इस लेख को आपके प्रश्नों का उत्तर देना चाहिए। saipraveenblog.wordpress.com/2014/09/29/rest-api-best-practices
java_geek

79

सीधे शब्दों में कहें, तो आप इसे पूरी तरह से पिछड़ा हुआ कर रहे हैं।

आपको इस बात से संपर्क नहीं करना चाहिए कि आप किन URLs का उपयोग कर रहे हैं। आपके सिस्टम के लिए कौन से संसाधन आवश्यक हैं, और आप उन संसाधनों का प्रतिनिधित्व कैसे करेंगे, और संसाधनों और अनुप्रयोग स्थिति के बीच पारस्परिक क्रियाओं के बारे में निर्णय लेने के बाद, URL प्रभावी रूप से "मुफ़्त में" आएगा।

रॉय फील्डिंग को उद्धृत करने के लिए

REST API को अपने सभी वर्णनात्मक प्रयासों को संसाधनों और ड्राइविंग एप्लिकेशन राज्य का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले मीडिया प्रकार (ओं) को परिभाषित करने में, या मौजूदा मानक मीडिया प्रकारों के लिए विस्तारित संबंध नामों और / या हाइपरटेक्स्ट-सक्षम मार्क-अप को परिभाषित करने में खर्च करना चाहिए। किसी भी प्रकार के यूआरआई को एक मीडिया प्रकार के लिए प्रसंस्करण नियमों के दायरे में (और, ज्यादातर मामलों में, पहले से ही मौजूदा मीडिया प्रकारों द्वारा परिभाषित किया गया है) का उपयोग करने के लिए क्या विधियों का उपयोग करना चाहिए, यह बताने में खर्च किए गए किसी भी प्रयास। [यहाँ असफलता का अर्थ है कि बाहर की जानकारी हाइपरटेक्स्ट के बजाय बातचीत चला रही है।]

फोल्क्स हमेशा यूआरआई के साथ शुरू होते हैं और सोचते हैं कि यह समाधान है, और फिर वे आरईएसटी आर्किटेक्चर में एक महत्वपूर्ण अवधारणा को याद करते हैं, विशेष रूप से, जैसा कि ऊपर उद्धृत किया गया है, "यहां विफलता का मतलब है कि हाइपरटेक्स्ट के बजाय आउट-ऑफ-बैंड जानकारी इंटरैक्शन चला रही है। "

ईमानदार होने के लिए, कई यूआरआई और कुछ जीईटी और पीयूटी और पोस्ट का एक गुच्छा देखते हैं और सोचते हैं कि आरईएसटी आसान है। आराम करना आसान नहीं है। HTTP पर RPC आसान है, HTTP पेलोड के माध्यम से प्रॉक्साइड डेटा को आगे पीछे करना आसान है। हालाँकि, इससे भी आगे निकल जाता है। REST प्रोटोकॉल अज्ञेयवादी है। REST सिस्टम के लिए HTTP बहुत लोकप्रिय और उपयुक्त है।

REST मीडिया प्रकारों, उनकी परिभाषाओं में रहता है, और कैसे एप्लिकेशन हाइपरटेक्स्ट (लिंक, प्रभावी रूप से) के माध्यम से उन संसाधनों के लिए उपलब्ध कार्यों को चलाता है।

REST सिस्टम में मीडिया प्रकारों के बारे में अलग-अलग दृष्टिकोण हैं। कुछ पक्ष विशिष्ट पेलोड को लागू करते हैं, जबकि अन्य मौजूदा मीडिया प्रकारों को उन भूमिकाओं में बदलना पसंद करते हैं जो आवेदन के लिए उपयुक्त हैं। उदाहरण के लिए, एक तरफ आपके पास विशिष्ट XML स्कीमा है जिसे आपके आवेदन के अनुकूल बनाया गया है, जो आपके प्रतिनिधित्व के रूप में एक्सएचटीएमएल जैसी किसी चीज़ का उपयोग कर रहा है, शायद माइक्रोफ़ॉर्मेट्स और अन्य तंत्रों के माध्यम से।

दोनों दृष्टिकोणों में अपनी जगह है, मुझे लगता है, एक्सएचटीएमएल परिदृश्यों में बहुत अच्छी तरह से काम कर रहा है जो मानव संचालित और मशीन संचालित वेब दोनों को ओवरलैप करते हैं, जबकि पूर्व, अधिक विशिष्ट डेटा प्रकार मुझे मशीन इंटरैक्शन के लिए बेहतर सुविधा प्रदान करते हैं। मुझे लगता है कि कमोडिटी प्रारूपों के उत्थान से सामग्री की बातचीत संभावित रूप से कठिन हो सकती है। "एप्लिकेशन / xml + yourresource" "एप्लिकेशन / xhtml + xml" की तुलना में मीडिया प्रकार के रूप में बहुत अधिक विशिष्ट है, क्योंकि उत्तरार्द्ध कई पेलोड पर लागू हो सकता है जो मशीन ग्राहक वास्तव में रुचि रखते हैं या नहीं हो सकते हैं, न ही ऐसा हो सकता है। आत्मनिरीक्षण के बिना निर्धारित करें।

हालाँकि, XHTML मानव वेब में बहुत अच्छी तरह से (स्पष्ट रूप से) काम करता है जहाँ वेब ब्राउज़र और रेंडरिंग बहुत महत्वपूर्ण है।

आप आवेदन उन प्रकार के निर्णयों में आपका मार्गदर्शन करेंगे।

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

याद रखें कि एक संसाधन का प्रत्येक प्रतिनिधित्व, एक हाइपरटेक्स्ट सिस्टम में, संसाधन के लिए उपलब्ध राज्य संक्रमण के साथ वास्तविक संसाधन प्रतिनिधित्व दोनों को जोड़ता है। प्रत्येक संसाधन को एक ग्राफ में एक नोड पर विचार करें, लिंक के साथ उस नोड को अन्य राज्यों में छोड़ दिया जा रहा है। ये लिंक ग्राहकों को न केवल यह सूचित करते हैं कि क्या किया जा सकता है, बल्कि उनके लिए क्या आवश्यक है (जैसा कि एक अच्छा लिंक URI और मीडिया प्रकार को जोड़ता है)।

उदाहरण के लिए, आपके पास हो सकता है:

<link href="http://example.com/users" rel="users" type="application/xml+usercollection"/>
<link href="http://example.com/users?search" rel="search" type="application/xml+usersearchcriteria"/>

आपके दस्तावेज़ "उपयोगकर्ता" नाम के रिले फ़ील्ड और "एप्लिकेशन / xml + youruser" के मीडिया प्रकार के बारे में बात करेंगे।

ये लिंक बेमानी लग सकते हैं, वे सभी एक ही यूआरआई से बात कर रहे हैं, बहुत ज्यादा। लेकिन वे नहीं हैं।

ऐसा इसलिए है क्योंकि "उपयोगकर्ता" संबंध के लिए, वह लिंक उपयोगकर्ताओं के संग्रह के बारे में बात कर रहा है, और आप संग्रह के साथ काम करने के लिए एकसमान इंटरफ़ेस का उपयोग कर सकते हैं (उन सभी को पुनः प्राप्त करने के लिए, इन सभी को हटाने के लिए DELETE, आदि)

यदि आप इस URL पर POST करते हैं, तो आपको "एप्लिकेशन / xml + usercollection" दस्तावेज़ पास करना होगा, जिसमें संभवतः दस्तावेज़ में केवल एक उपयोगकर्ता का उदाहरण होगा, ताकि आप उपयोगकर्ता को जोड़ सकें, या नहीं, शायद, कई को जोड़ने के लिए एक बार। शायद आपके प्रलेखन का सुझाव होगा कि आप संग्रह के बजाय केवल एक उपयोगकर्ता प्रकार पास कर सकते हैं।

आप यह देख सकते हैं कि किसी खोज को करने के लिए एप्लिकेशन की क्या आवश्यकता है, जैसा कि "खोज" लिंक द्वारा परिभाषित किया गया है और यह मध्‍यस्‍थ है। खोज मीडिया प्रकार के लिए प्रलेखन आपको बताएगा कि यह कैसे व्यवहार करता है, और परिणाम के रूप में क्या उम्मीद है।

हालांकि, Ueas खुद मूल रूप से महत्वहीन हैं, हालांकि यहाँ टेकअवे। आवेदन URIs के नियंत्रण में है, न कि ग्राहकों के लिए। कुछ 'प्रवेश बिंदुओं' से परे, आपके ग्राहकों को अपने काम के लिए आवेदन द्वारा प्रदान किए गए यूआरआई पर भरोसा करना चाहिए।

क्लाइंट को मीडिया प्रकारों में हेरफेर और व्याख्या करने का तरीका जानने की जरूरत है, लेकिन यह ध्यान रखने की ज़रूरत नहीं है कि यह कहाँ जाता है।

ये दोनों लिंक ग्राहकों की दृष्टि में समान हैं:

<link href="http://example.com/users?search" rel="search" type="application/xml+usersearchcriteria"/>
<link href="http://example.com/AW163FH87SGV" rel="search" type="application/xml+usersearchcriteria"/>

इसलिए अपने संसाधनों पर ध्यान दें। आवेदन में उनके राज्य परिवर्तन पर ध्यान दें और यह सबसे अच्छा कैसे हासिल किया जाता है।


1
इस बहुत गहरे उत्तर के लिए धन्यवाद विल। कई बिंदु लिए गए। मुझे लगता है कि "URL क्या दिखता है" से यह योजना दूसरे तरीके से कर रही है, और मैं संसाधन पक्ष से भी योजना बना रहा हूं। केवल खेलने के लिए URL होने से मेरे लिए अवधारणा को समझना और अधिक आसान हो गया है। यह हो सकता है कि मेरी आवश्यकताओं को एक प्रणाली से पूरा किया जा सकता है जो 100% REST सिद्धांतों का पालन नहीं करती है जैसा कि आप इसे यहां परिभाषित करते हैं। मैं प्रत्येक संसाधन प्रकार के लिए आवश्यकताओं की पूरी सूची तैयार करूंगा, मुझे लगता है कि मैं तब निर्णय लेने में सक्षम होऊंगा। चीयर्स।
पेका

30

पुनः 1 : यह अब तक ठीक लग रहा है। "201 बनाया गया" स्थिति कोड के साथ, POST की प्रतिक्रिया के भाग के रूप में "स्थान:" शीर्षक में नए बनाए गए उपयोगकर्ता के यूआरआई को वापस करना याद रखें।

पुनः २: GET के माध्यम से सक्रियण एक बुरा विचार है, और URI में क्रिया सहित एक डिजाइन गंध है। आप GET पर एक फॉर्म वापस करने पर विचार कर सकते हैं। एक वेब ऐप में, यह सबमिट बटन के साथ एक HTML फॉर्म होगा; एपीआई उपयोग के मामले में, आप एक प्रतिनिधित्व वापस करना चाहते हैं जिसमें खाता सक्रिय करने के लिए यूआरआई टू पीयूटी शामिल है। बेशक आप इस URI को POST / उपयोगकर्ताओं पर प्रतिक्रिया में भी शामिल कर सकते हैं। PUT का उपयोग यह सुनिश्चित करेगा कि आपका अनुरोध उदासीन है, अर्थात यदि ग्राहक सफलता के बारे में सुनिश्चित नहीं है तो इसे फिर से सुरक्षित रूप से भेजा जा सकता है। सामान्य तौर पर, इस बारे में सोचें कि आप किन क्रियाओं को बदल सकते हैं (जैसे "क्रियाओं की संज्ञा")। अपने आप से पूछें कि आपकी विशिष्ट क्रिया किस विधि के साथ सबसे अधिक निकट है। जैसे परिवर्तन_पासवर्ड -> पूट; निष्क्रिय करें -> शायद DELETE; add_credit -> संभवतः POST या PUT।

फिर से 3. नए स्टेटस कोड का आविष्कार न करें, जब तक आपको विश्वास न हो कि वे इतने सामान्य हैं कि वे वैश्विक स्तर पर मानकीकृत हैं। उपलब्ध सबसे उपयुक्त स्थिति कोड का उपयोग करने के लिए कड़ी मेहनत करें (RFC 2616 में उन सभी के बारे में पढ़ें)। प्रतिक्रिया निकाय में अतिरिक्त जानकारी शामिल करें। यदि आप वास्तव में, वास्तव में निश्चित हैं कि आप एक नए स्टेटस कोड का आविष्कार करना चाहते हैं, तो फिर से सोचें; यदि आप अभी भी ऐसा मानते हैं, तो कम से कम सही श्रेणी (1xx -> ठीक है, 2xx -> सूचनात्मक, 3xx -> पुनर्निर्देशन; 4xx-> ग्राहक त्रुटि, 5xx -> सर्वर त्रुटि) चुनें। क्या मैंने उल्लेख किया कि नए स्टेटस कोड का आविष्कार करना एक बुरा विचार है?

4. 4. यदि किसी भी तरह से संभव हो, तो HTTP में निर्मित प्रमाणीकरण ढांचे का उपयोग करें। Google द्वारा GData में प्रमाणीकरण करने के तरीके की जाँच करें। सामान्य तौर पर, अपने URI में API कुंजियाँ न रखें। स्केलेबिलिटी बढ़ाने और कैशिंग का समर्थन करने के लिए सत्रों से बचने की कोशिश करें - यदि अनुरोध का जवाब कुछ अलग होने के कारण अलग हो जाता है, तो आप आमतौर पर एक विशिष्ट सर्वर प्रक्रिया उदाहरण के लिए खुद को बांध लेते हैं। सत्र स्थिति को ग्राहक अवस्था में बदलना बहुत बेहतर है (जैसे कि इसे बाद के अनुरोधों का हिस्सा बनाएं) या इसे (सर्वर) संसाधन स्थिति में बदलकर स्पष्ट करें, अर्थात इसे अपना URI दें।


क्या आप चर्चा कर सकते हैं कि URL में API कुंजियाँ क्यों नहीं रखी जाएँ? क्या यह है क्योंकि वे प्रॉक्सी लॉग में दिखाई देते हैं? क्या होगा अगर चाबियाँ क्षणिक, समय-आधारित हैं? यदि HTTPS का उपयोग किया जाता है तो क्या होगा?
माइकस्किंकेल

4
भावना का उल्लंघन करने के अलावा (यूआरआई को चीजों की पहचान करनी चाहिए), मुख्य परिणाम यह है कि यह कैशिंग को बर्बाद करता है।
स्टीफन टिलकोव

22

1. आपको अपने संसाधनों, आईएमएचओ को डिजाइन करने के बारे में सही विचार मिला है। मैं एक चीज़ नहीं बदलूंगा।

2. HTTP को अधिक क्रियाओं के साथ विस्तारित करने की कोशिश करने के बजाय, विचार करें कि मूल HTTP विधियों और संसाधनों के संदर्भ में आपके प्रस्तावित क्रियाओं को क्या कम किया जा सकता है। उदाहरण के लिए, एक activate_loginक्रिया के बजाय , आप संसाधन सेट कर सकते हैं जैसे: /api/users/1/login/activeजो एक साधारण बूलियन है। एक लॉगिन को सक्रिय करने के लिए, बस PUTवहां एक दस्तावेज जो 'सच' या 1 या जो भी कहता है। निष्क्रिय करने के लिए, PUTवहां एक दस्तावेज़ जो खाली है या 0 या गलत कहता है।

इसी तरह, पासवर्ड बदलने या सेट करने के लिए, बस करना PUTहै /api/users/1/password

जब भी आपको कुछ जोड़ने की जरूरत है (एक क्रेडिट की तरह) POSTएस के संदर्भ में सोचें । उदाहरण के लिए, आप एक POSTऐसे संसाधन का उपयोग कर सकते हैं जैसे /api/users/1/creditsकि एक निकाय जिसमें क्रेडिट जोड़ने की संख्या हो। एक PUTही संसाधन पर जोड़ने के बजाय मान ओवरराइट किया जा सकता है। एक POSTशरीर में एक नकारात्मक संख्या के साथ घटाना होता है, और इतने पर।

3. मैं मूल HTTP स्थिति कोड्स को बढ़ाने के खिलाफ जोरदार सलाह देना चाहूंगा। यदि आप अपनी स्थिति से पूरी तरह मेल खाते हैं, तो आप निकटतम को चुन सकते हैं और प्रतिक्रिया विवरण में त्रुटि विवरण डाल सकते हैं। यह भी याद रखें कि HTTP हेडर एक्स्टेंसिबल हैं; आपका एप्लिकेशन उन सभी कस्टम हेडर को परिभाषित कर सकता है जो आपको पसंद हैं। उदाहरण के लिए मैंने जिस एक एप्लिकेशन पर काम किया, वह 404 Not Foundकई परिस्थितियों में वापस आ सकता है। कारण के लिए ग्राहक को प्रतिसाद निकाय बनाने के बजाय, हमने सिर्फ एक नया हेडर जोड़ा X-Status-Extended, जिसमें हमारे मालिकाना स्थिति कोड एक्सटेंशन शामिल थे। तो आप इस तरह की प्रतिक्रिया देख सकते हैं:

HTTP/1.1 404 Not Found    
X-Status-Extended: 404.3 More Specific Error Here

इस तरह एक वेब ब्राउज़र की तरह HTTP क्लाइंट को अब भी पता चलेगा कि नियमित 404 कोड का क्या करना है, और अधिक परिष्कृत HTTP क्लाइंट X-Status-Extendedअधिक विशिष्ट जानकारी के लिए हेडर को देखना चुन सकता है ।

4. प्रमाणीकरण के लिए, यदि आप कर सकते हैं तो मैं HTTP प्रमाणीकरण का उपयोग करने की सलाह देता हूं। लेकिन अगर आपके लिए यह आसान है तो IMHO कुकी-आधारित प्रमाणीकरण का उपयोग करने में कुछ भी गलत नहीं है।


4
बड़े संसाधन के छोटे भागों में चीजों को करने के लिए "विस्तारित" संसाधनों का उपयोग करने का नीट विचार।
वीनबल

1
HTTP / REST में कुकीज़ मान्य हैं, लेकिन सर्वर को कुकी को राज्य के रूप में संग्रहीत नहीं करना चाहिए (इसलिए सत्र के रूप में नहीं)। कुकी एचएमएसी जैसे मूल्य को संग्रहीत कर सकती है, हालांकि, जो राज्य को कहीं और देखे बिना विस्थापित हो सकती है।
ब्रूस एल्डर्सन

14

बाकी मूल बातें

REST के पास एक समान इंटरफ़ेस बाधा है, जो बताता है कि REST क्लाइंट को वास्तविक REST सेवा के अनुप्रयोग विशिष्ट विवरणों के बजाय मानकों पर निर्भर होना चाहिए, इसलिए REST क्लाइंट मामूली बदलावों से नहीं टूटेगा, और यह संभवतः पुन: प्रयोज्य होगा।

तो REST क्लाइंट और REST सेवा के बीच एक अनुबंध है। यदि आप HTTP को अंतर्निहित प्रोटोकॉल के रूप में उपयोग करते हैं, तो निम्नलिखित मानक अनुबंध का हिस्सा हैं:

  • HTTP 1.1
    • विधि परिभाषाएँ
    • स्थिति कोड परिभाषाएँ
    • कैश कंट्रोल हेडर
    • स्वीकार करें और सामग्री-प्रकार हेडर
    • मुखिया हेडर
  • IRI (utf8 URI )
  • शरीर (एक उठाओ)
    • पंजीकृत आवेदन विशिष्ट MIME प्रकार, जैसे भूलभुलैया + xml
    • विक्रेता विशिष्ट MIME प्रकार, जैसे vnd.github + json
    • सामान्य प्रकार के साथ
      • अनुप्रयोग विशिष्ट RDF शब्दकोष, जैसे ld + json & hydra , schema.org
      • आवेदन विशिष्ट प्रोफ़ाइल, उदाहरण के लिए hal + json और प्रोफ़ाइल लिंक param (मुझे लगता है)
  • हाइपरलिंक
    • उनमें क्या होना चाहिए (एक को चुनें)
      • लिंक हेडर में भेजना
      • एक हाइपरमीडिया प्रतिक्रिया में भेज रहा है, उदाहरण के लिए html, परमाणु + xml, hal + json, ld + json और हाइड्रोज़, आदि ...
    • अर्थ विज्ञान
      • IANA लिंक संबंधों और शायद कस्टम लिंक संबंधों का उपयोग करें
      • एक अनुप्रयोग विशिष्ट RDF शब्द का उपयोग करें

आरईएसटी में एक सांख्यिकीय बाधा है, जो घोषणा करता है कि आरईएसटी सेवा और ग्राहक के बीच संचार को स्टेटलेस होना चाहिए। इसका अर्थ है कि REST सेवा क्लाइंट राज्यों को बनाए नहीं रख सकती है, इसलिए आपके पास सर्वर साइड सत्र भंडारण नहीं हो सकता है। आपको हर एक अनुरोध को प्रमाणित करना होगा। इसलिए उदाहरण के लिए HTTP बेसिक (HTTP मानक का हिस्सा) ठीक है, क्योंकि यह हर अनुरोध के साथ उपयोगकर्ता नाम और पासवर्ड भेजता है।

आपको सवालों के जवाब देने के लिए

  1. हाँ, यह हो सकता है।

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

    IRI के बारे में केवल एक ही बात महत्वपूर्ण है कि एक IRI को केवल एक ही संसाधन की पहचान करनी चाहिए। यह एक एकल संसाधन की अनुमति है, एक उपयोगकर्ता की तरह, कई अलग-अलग आईआरआई हैं।

    यह बहुत आसान है कि हम अच्छे IRI का उपयोग क्यों करते हैं /users/123/password; सर्वर पर रूटिंग लॉजिक लिखना बहुत आसान है जब आप IRI को केवल पढ़कर समझ जाते हैं।

  2. आपके पास अधिक क्रियाएं हैं, जैसे PUT, PATCH, OPTIONS, और भी बहुत कुछ, लेकिन आपको उनमें से अधिक की आवश्यकता नहीं है ... नए क्रियाओं को जोड़ने के बजाय आपको सीखना होगा कि नए संसाधनों को कैसे जोड़ना है।

    activate_login -> PUT /login/active true deactivate_login -> PUT /login/active false change_password -> PUT /user/xy/password "newpass" add_credit -> POST /credit/raise {details: {}}

    (स्टेटलेस परिप्रेक्ष्य से लॉगिन का कोई मतलब नहीं है, क्योंकि स्टेटलेस परिप्रेक्ष्य में।)

  3. आपके उपयोगकर्ता इस बात की परवाह नहीं करते हैं कि समस्या क्यों है। वे केवल यह जानना चाहते हैं कि क्या सफलता या त्रुटि है, और शायद एक त्रुटि संदेश जिसे वे समझ सकते हैं, उदाहरण के लिए: "क्षमा करें, लेकिन हम आपकी पोस्ट को सहेजने में सक्षम नहीं थे।", आदि ...

    HTTP स्टेटस हेडर आपके मानक हेडर हैं। मुझे लगता है कि शरीर में बाकी सब कुछ होना चाहिए। एक एकल हेडर उदाहरण के लिए विस्तृत बहुभाषी त्रुटि संदेशों का वर्णन करने के लिए पर्याप्त नहीं है।

  4. स्टेटलेस कंस्ट्रक्शन (कैश और लेयर्ड सिस्टम की कमी के साथ) यह सुनिश्चित करता है कि सर्विस अच्छी हो। आप निश्चित रूप से सर्वर पर लाखों सत्रों को बनाए रखने के लिए नहीं चाहते हैं, जब आप ग्राहकों पर ऐसा कर सकते हैं ...

    यदि उपयोगकर्ता मुख्य ग्राहक का उपयोग करके उसे अनुदान देता है तो 3rd पार्टी क्लाइंट को एक्सेस टोकन मिलता है। उसके बाद 3rd पार्टी क्लाइंट हर अनुरोध के साथ एक्सेस टोकन भेजता है। अधिक जटिल समाधान हैं, उदाहरण के लिए आप हर एक अनुरोध पर हस्ताक्षर कर सकते हैं, आदि अधिक जानकारी के लिए OAuth मैनुअल की जांच करें।

संबंधित साहित्य


11

आपके द्वारा बताए गए उदाहरणों के लिए मैं निम्नलिखित का उपयोग करूंगा:

activate_login

POST /users/1/activation

deactivate_login

DELETE /users/1/activation

पासवर्ड बदलें

PUT /passwords (यह मानता है कि उपयोगकर्ता प्रमाणित है)

क्रेडिट जोड़ने

POST /credits (यह मानता है कि उपयोगकर्ता प्रमाणित है)

त्रुटियों के लिए आप उस प्रारूप में शरीर में त्रुटि लौटाएंगे जो आपको अनुरोध में मिली थी, इसलिए यदि आप प्राप्त करते हैं:

DELETE /users/1.xml

आप प्रतिक्रिया को XML में वापस भेज देंगे, वही JSON आदि के लिए सही होगा ...

प्रमाणीकरण के लिए आपको http प्रमाणीकरण का उपयोग करना चाहिए।


1
मैं createURI के भाग के रूप में उपयोग नहीं करूंगा (याद रखें कि URI संज्ञाएं होनी चाहिए, और HTTP तरीके उन संज्ञाओं पर काम करने वाले क्रिया होने चाहिए।) इसके बजाय, मेरे पास एक संसाधन होगा जैसे /users/1/activeकि एक साधारण बूलियन हो सकता है, और यह हो सकता है उस संसाधन पर 1 या 0 दबाकर सेट करें।
फ्राइडो

आप ठीक कह रहे हैं, मैंने / निर्माण किया। यह सिर्फ सिंगलटन संसाधन के लिए एक पद होना चाहिए।
जोंनी

3
activationजब तक आप स्पष्ट रूप से हेरफेर नहीं करेंगे और यूआरआई के नाम से एक संसाधन का प्रबंधन नहीं करेंगे, तब तक मैं यूआरआई पर उपयोग नहीं करूंगा /users/1/activation। उस पर GET क्या करता है? PUT क्या करता है? मुझे यकीन है कि आपको लगता है कि आप यूआरआई की पुष्टि कर रहे हैं। साथ ही, सामग्री-प्रकार की बातचीत के लिए भी, जिसे अक्सर यूआरआई से बाहर छोड़ दिया जाता है और हेडर में डाला जाता है, जैसे Accept
चीज़ो

6
  1. पोस्ट का उपयोग तब करें जब आपको पता न हो कि नए संसाधन URI कैसे दिखेंगे (आप नया उपयोगकर्ता बनाते हैं, एप्लिकेशन नए उपयोगकर्ता को यह आईडी प्रदान करेगा), संसाधनों को अपडेट करने या बनाने के लिए पीयूटी जो आप जानते हैं कि वे कैसे प्रतिनिधित्व करने जा रहे हैं (उदाहरण के लिए) : PUT /myfiles/thisismynewfile.txt)
  2. संदेश शरीर में त्रुटि विवरण लौटाएं
  3. आप HTTP प्रमाणीकरण का उपयोग कर सकते हैं (यदि यह पर्याप्त है) वेब सेवाओं को स्टेटेल होना चाहिए

5

मैं सुझाव दूंगा (पहले पास के रूप में) जिसका PUTउपयोग केवल मौजूदा संस्थाओं को अपडेट करने के लिए किया जाना चाहिए। POSTनए बनाने के लिए इस्तेमाल किया जाना चाहिए। अर्थात

/api/users     when called with PUT, creates user record

मुझे सही नहीं लगता। हालाँकि, आपका पहला खंड (पुनः क्रिया उपयोग) बाकी तर्कसंगत लगता है।


शायद किसी ने सोचा कि यह वास्तव में उसके सवाल का जवाब नहीं है
लूबोस हैस्को

6
नई इकाइयाँ बनाने के लिए PUT बनाम POST पर मेरा ध्यान PUT का उपयोग करने पर है जब कॉलर संसाधन नाम को नियंत्रित करता है, तो आप सटीक संसाधन और POST के लिए PUT कर सकते हैं जब कैली नए संसाधन नाम को नियंत्रित करता है (जैसे कि यहाँ उदाहरण में)।
स्टीव

5

Verbose, लेकिन http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html पर HTTP 1.1 विधि विनिर्देश से कॉपी किया गया

9.3 जी.ई.टी.

GET विधि का अर्थ है अनुरोध-URI द्वारा पहचानी गई किसी भी जानकारी (एक इकाई के रूप में) को पुनः प्राप्त करना। यदि अनुरोध-URI डेटा-उत्पादक प्रक्रिया को संदर्भित करता है, तो यह उत्पादित डेटा है जिसे प्रतिक्रिया में इकाई के रूप में लौटाया जाएगा और प्रक्रिया के स्रोत पाठ को नहीं, जब तक कि पाठ प्रक्रिया का आउटपुट नहीं होता।

GET पद्धति का शब्दार्थ एक "सशर्त GET" में बदल जाता है, यदि अनुरोध संदेश में एक IF-Modified-चूंकि, if-Unmodified- चूंकि, if-Match, if-none-Match, या if-Range हैडर फ़ील्ड शामिल हैं। एक सशर्त GET विधि अनुरोध करती है कि इकाई को केवल सशर्त हेडर फ़ील्ड (एस) द्वारा वर्णित परिस्थितियों में स्थानांतरित किया जाए। सशर्त GET विधि का उद्देश्य अनावश्यक नेटवर्क उपयोग को कम करने के लिए कैश्ड संस्थाओं को कई अनुरोधों की आवश्यकता के बिना ताज़ा करने की अनुमति देना या क्लाइंट द्वारा पहले से रखे गए डेटा को स्थानांतरित करना है।

यदि अनुरोध संदेश में श्रेणी हेडर फ़ील्ड शामिल है, तो GET पद्धति का शब्दार्थ एक "आंशिक GET" में बदल जाता है। एक आंशिक GET अनुरोध करता है कि इकाई का केवल एक हिस्सा स्थानांतरित किया जाए, जैसा कि अनुभाग 14.35 में वर्णित है। आंशिक GET विधि का उद्देश्य ग्राहक द्वारा पहले से रखे गए डेटा को स्थानांतरित किए बिना आंशिक रूप से पुनः प्राप्त संस्थाओं को पूरा करने की अनुमति देकर अनावश्यक नेटवर्क उपयोग को कम करना है।

GET अनुरोध की प्रतिक्रिया तब और तब उपलब्ध होती है जब वह धारा 13 में वर्णित HTTP कैशिंग की आवश्यकताओं को पूरा करता है।

प्रपत्रों के लिए उपयोग किए जाने पर सुरक्षा विचारों के लिए खंड 15.1.3 देखें।

9.5 पोस्ट

POST विधि का उपयोग अनुरोध करने के लिए किया जाता है कि मूल सर्वर अनुरोध में संलग्न इकाई को अनुरोध-लाइन में अनुरोध-यूआरआई द्वारा पहचाने गए संसाधन के एक नए अधीनस्थ के रूप में स्वीकार करता है। POST को निम्नलिखित कार्यों को कवर करने के लिए एक समान विधि की अनुमति देने के लिए डिज़ाइन किया गया है:

  - Annotation of existing resources;
  - Posting a message to a bulletin board, newsgroup, mailing list,
    or similar group of articles;
  - Providing a block of data, such as the result of submitting a
    form, to a data-handling process;
  - Extending a database through an append operation.

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

POST विधि द्वारा की गई कार्रवाई के परिणामस्वरूप एक संसाधन नहीं हो सकता है जिसे URI द्वारा पहचाना जा सकता है। इस मामले में, 200 (ओके) या 204 (कोई सामग्री) उपयुक्त प्रतिक्रिया की स्थिति है, इस पर निर्भर करता है कि प्रतिक्रिया में एक इकाई शामिल है जो परिणाम का वर्णन करती है।

यदि मूल सर्वर पर एक संसाधन बनाया गया है, तो प्रतिक्रिया SHOULD 201 (बनाई गई) होनी चाहिए और इसमें एक इकाई शामिल होगी जो अनुरोध की स्थिति का वर्णन करती है और नए संसाधन को संदर्भित करती है, और एक स्थान हेडर (अनुभाग 14.30 देखें)।

जब तक प्रतिक्रिया में उपयुक्त कैश-नियंत्रण या शीर्ष लेख फ़ील्ड शामिल नहीं होते हैं, तब तक इस विधि के लिए प्रतिक्रियाशील व्यवहार्य नहीं हैं। हालाँकि, 303 (अन्य देखें) प्रतिक्रिया का उपयोग उपयोगकर्ता एजेंट को निर्देश देने के लिए किया जा सकता है ताकि एक उपलब्ध संसाधन प्राप्त किया जा सके।

पोस्ट अनुरोधों को धारा 8.2 में निर्धारित संदेश प्रसारण आवश्यकताओं का पालन करना चाहिए।

सुरक्षा विचारों के लिए खंड 15.1.3 देखें।

9.6 PUT

PUT विधि अनुरोध करती है कि संलग्न इकाई को आपूर्ति अनुरोध-URI के तहत संग्रहीत किया जाए। यदि अनुरोध-URI पहले से मौजूद संसाधन को संदर्भित करता है, तो संलग्न इकाई SHOULD को मूल सर्वर पर रहने वाले एक के संशोधित संस्करण के रूप में माना जाना चाहिए। यदि अनुरोध-URI मौजूदा संसाधन की ओर संकेत नहीं करता है, और यह कि URI अनुरोधित उपयोगकर्ता एजेंट द्वारा एक नए संसाधन के रूप में परिभाषित किया जा सकता है, तो मूल सर्वर उस URI के साथ संसाधन बना सकता है। यदि कोई नया संसाधन बनाया जाता है, तो मूल सर्वर को 201 (बनाया गया) प्रतिक्रिया के माध्यम से उपयोगकर्ता एजेंट को सूचित करना चाहिए। यदि किसी मौजूदा संसाधन को संशोधित किया जाता है, तो 200 (OK) या 204 (कोई सामग्री) प्रतिक्रिया कोड SHOULD को अनुरोध के सफल समापन को इंगित करने के लिए भेजा जाना चाहिए। यदि संसाधन अनुरोध-URI के साथ बनाया या संशोधित नहीं किया जा सकता है, एक उचित त्रुटि प्रतिक्रिया दी जानी चाहिए जो समस्या की प्रकृति को दर्शाती है। इकाई के प्राप्तकर्ता को किसी भी सामग्री को अनदेखा नहीं करना चाहिए- * (उदाहरण के लिए सामग्री-श्रेणी) हेडर कि यह समझ में नहीं आता है या कार्यान्वित नहीं होता है और ऐसे मामलों में एक 501 (लागू नहीं) प्रतिक्रिया वापस करना होगा।

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

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

यह 301 भेजना चाहिए (स्थायी रूप से स्थानांतरित) प्रतिक्रिया; उपयोगकर्ता एजेंट MAY तब अनुरोध को पुनर्निर्देशित करने या न करने के संबंध में अपना निर्णय लेता है।

एक एकल संसाधन MAY को कई अलग-अलग URI द्वारा पहचाना जाता है। उदाहरण के लिए, एक लेख में "वर्तमान संस्करण" की पहचान करने के लिए एक यूआरआई हो सकता है जो प्रत्येक विशेष संस्करण की पहचान करने वाले यूआरआई से अलग है। इस स्थिति में, सामान्य URI पर PUT अनुरोध के परिणामस्वरूप कई अन्य URI मूल सर्वर द्वारा परिभाषित किए जा सकते हैं।

HTTP / 1.1 यह परिभाषित नहीं करता है कि PUT विधि मूल सर्वर की स्थिति को कैसे प्रभावित करती है।

PUT अनुरोध जरूरी है कि धारा 8.2 में निर्धारित संदेश संचरण आवश्यकताओं का पालन करें।

जब तक अन्यथा किसी विशेष इकाई-शीर्ष के लिए निर्दिष्ट नहीं किया जाता है, तब तक PUT अनुरोध में इकाई प्रमुखों को PUT द्वारा बनाए गए या संशोधित किए गए संसाधन पर लागू किया जाना चाहिए।

9.7 DELETE

DELETE विधि अनुरोध करती है कि मूल सर्वर अनुरोध-URI द्वारा पहचाने गए संसाधन को हटा दें। इस विधि को मूल सर्वर पर मानव हस्तक्षेप (या अन्य साधनों) द्वारा ओवरराइड किया जाना चाहिए। क्लाइंट को गारंटी नहीं दी जा सकती है कि ऑपरेशन किया गया है, भले ही स्थिति कोड मूल सर्वर से लौटा हो यह इंगित करता है कि कार्रवाई सफलतापूर्वक पूरी हो गई है। हालाँकि, सर्वर SHOULD को तब तक सफलता का संकेत नहीं देता जब तक कि उस समय प्रतिक्रिया न दी जाए, यह संसाधन को हटाने या उसे दुर्गम स्थान पर ले जाने का इरादा रखता है।

एक सफल प्रतिक्रिया 200 होना चाहिए (ठीक है) यदि प्रतिक्रिया में स्थिति का वर्णन करने वाली एक इकाई शामिल है, 202 (स्वीकृत) यदि कार्रवाई अभी तक लागू नहीं हुई है, या 204 (कोई सामग्री नहीं) यदि कार्रवाई अधिनियमित की गई है, लेकिन प्रतिक्रिया में शामिल नहीं है एक इकाई।

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


2

REST रिटर्न कोड के बारे में: HTTP प्रोटोकॉल कोड और REST परिणाम को मिलाना गलत है।

हालाँकि, मैंने कई कार्यान्वयनों को मिलाते हुए देखा, और कई डेवलपर्स मुझसे सहमत नहीं हो सकते हैं।

HTTP रिटर्न कोड HTTP Requestखुद से संबंधित हैं । एक REST कॉल हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल अनुरोध का उपयोग करके किया जाता है और यह अपने आप में रेकॉल्ड REST विधि से कम स्तर पर काम करता है। REST एक अवधारणा / दृष्टिकोण है, और इसका आउटपुट एक व्यावसायिक / तार्किक परिणाम है, जबकि HTTP परिणाम कोड एक परिवहन है।

उदाहरण के लिए, "404 नहीं मिला" वापस करना जब आप कॉल करते हैं / उपयोगकर्ता / भ्रमित होते हैं, क्योंकि इसका मतलब हो सकता है:

  • URI गलत है (HTTP)
  • कोई उपयोगकर्ता नहीं मिला (REST)

"403 निषिद्ध / पहुँच निषेध" का अर्थ हो सकता है:

  • विशेष अनुमति की आवश्यकता है। ब्राउजर इसे यूजर / पासवर्ड पूछकर संभाल सकता है। (एचटीटीपी)
  • सर्वर पर गलत पहुंच अनुमतियाँ कॉन्फ़िगर की गई हैं। (एचटीटीपी)
  • आपको प्रमाणित होना चाहिए (REST)

और सूची '500 सर्वर त्रुटि' (Apache / Nginx HTTP फेंकी गई त्रुटि या REST में व्यावसायिक बाधा त्रुटि) या अन्य HTTP त्रुटियों आदि के साथ जारी रह सकती है ...

कोड से, यह समझना मुश्किल है कि विफलता का कारण क्या था, एक HTTP (परिवहन) विफलता या REST (तार्किक) विफलता।

यदि HTTP अनुरोध भौतिक रूप से सफलतापूर्वक किया गया था, तो उसे हमेशा 200 कोड वापस करना चाहिए , भले ही रिकॉर्ड पाया गया हो या नहीं। क्योंकि URI संसाधन पाया जाता है और http सर्वर द्वारा नियंत्रित किया जाता है। हां, यह एक खाली सेट लौटा सकता है। क्या http परिणाम के रूप में 200 के साथ एक खाली वेब-पेज प्राप्त करना संभव है, है ना?

इसके बजाय आप 200 HTTP कोड वापस कर सकते हैं और केवल JSON एक खाली सरणी / ऑब्जेक्ट के साथ, या निष्पादित ऑपरेशन स्थिति के बारे में सूचित करने के लिए एक बूल परिणाम / सफलता ध्वज का उपयोग कर सकते हैं।

साथ ही, कुछ इंटरनेट प्रदाता आपके अनुरोधों को रोक सकते हैं और आपको 404 http कोड वापस कर सकते हैं। इसका मतलब यह नहीं है कि आपका डेटा नहीं मिला है, लेकिन यह परिवहन स्तर पर कुछ गलत है।

से विकी :

जुलाई 2004 में, यूके टेलीकॉम प्रदाता बीटी ग्रुप ने क्लीनफीड कंटेंट ब्लॉकिंग सिस्टम की तैनाती की, जो कि इंटरनेट वॉच फाउंडेशन द्वारा संभावित रूप से अवैध रूप से पहचानी गई सामग्री के लिए किसी भी अनुरोध पर 404 त्रुटि देता है। अन्य ISP समान परिस्थितियों में HTTP 403 "निषिद्ध" त्रुटि लौटाते हैं। थाईलैंड और ट्यूनीशिया में सेंसरशिप छुपाने के साधन के रूप में नकली 404 त्रुटियों को नियोजित करने की प्रथा भी बताई गई है। ट्यूनीशिया में, जहां 2011 की क्रांति से पहले सेंसरशिप गंभीर थी, लोग नकली 404 त्रुटियों की प्रकृति से अवगत हुए और "अम्मर 404" नाम का एक काल्पनिक चरित्र बनाया, जो "अदृश्य सेंसर" का प्रतिनिधित्व करता है।

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