बेचैन POST प्रतिक्रिया के लिए 'सर्वश्रेष्ठ' अभ्यास


217

इसलिए यहां कुछ भी नया नहीं है, मैं केवल कुछ स्पष्टीकरण प्राप्त करने की कोशिश कर रहा हूं और अन्य पदों में कोई भी खोज नहीं कर सकता।

मैं एक नया संसाधन तैयार कर रहा हूँ, कहते हैं:

/books (POST)

एक शरीर के साथ:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

मुझे पता है कि मुझे नए संसाधन के एक हेडर के साथ 201 (निर्मित) लौटना चाहिए:

Location: /books/12345

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

मैंने अक्सर इस प्रकार की प्रतिक्रिया दी है:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

मैंने ऐसा कुछ कारणों से किया है:

  1. मैंने एंगुलरज जैसे फ्रंट एंड फ्रेमवर्क के लिए एपीआई लिखा है। मेरे विशेष मामले में मैं कोणीय संसाधनों का उपयोग कर रहा हूं और मुझे इसे खोजने के लिए अक्सर संसाधन के लिए सिर्फ आईडी की आवश्यकता होती है। अगर मैंने प्रतिक्रिया निकाय में आईडी वापस नहीं की, तो मुझे इसे स्थान शीर्षलेख से पार्स करने की आवश्यकता होगी।
  2. सभी पुस्तकों के एक GET में मैं आमतौर पर पूरी वस्तु वापस करता हूं न कि केवल आईडी। इस अर्थ में मेरे क्लाइंट कोड में अंतर नहीं है कि आईडी को कहां से प्राप्त करें (स्थान हेडर या बॉडी)।

अब मुझे पता है कि मैं वास्तव में यहां ग्रे एरिया में हूं, लेकिन ज्यादातर लोग कह रहे हैं कि पूरा संसाधन लौटाना 'बुरा' है। लेकिन क्या होगा अगर सर्वर संसाधन में जानकारी को बदल / जोड़ देता है। यह निश्चित रूप से आईडी जोड़ता है, लेकिन टाइमस्टैम्प जैसी अन्य चीजों को भी जोड़ सकता है। इस मामले में कि मैं पूरे संसाधन को वापस नहीं करता हूं, क्या वास्तव में एक POST करना बेहतर है, आईडी वापस करना है, तो ग्राहक को नए संसाधन प्राप्त करने के लिए एक GET प्रदर्शन करना होगा।


मैं व्यक्तिगत रूप से POST प्रतिक्रियाओं के लिए खाली शरीर पसंद करता हूं। RESTful स्थान शीर्षलेख मान URI (अद्वितीय संसाधन पहचानकर्ता) नहीं होना चाहिए? तो शायद आपको इसे एक आईडी के रूप में उपयोग करना चाहिए न कि किसी सर्वर आंतरिक आईडी का पता लगाने के लिए इसे पार्स करना चाहिए। IMO, RESTful API उपभोक्ताओं को हाइपरलिंक्स का उपयोग करके नेविगेट करना चाहिए और पथ का निर्माण नहीं करना चाहिए, यह अनुमान लगाते हुए कि एक विशेष सर्वर संसाधनों का पता कैसे लगाता है ... और आखिरकार, क्या ग्राहक पहले से ही बनाए गए संसाधन की स्थिति को नहीं जानता है? इसे दोहराने से नेटवर्क संसाधनों की बर्बादी होती है।
ch4mp

1
बनाएँ / सम्मिलित करें, स्थिति 201 के लिए - सृजित, शीर्षक स्थान → लोकलहोस्ट: 8080 / कर्मचारी / 1 (देखें: यहाँ )
हसन तारीक

जवाबों:


129

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

मुझे वास्तव में केवल आईडी लौटाने और उसके बाद जीईटी अनुरोध करने का कोई फायदा नहीं दिखता है, जो डेटा आपको अपने मोबाइल पोस्ट के साथ मिल सकता है।

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


26
मुझे पता है कि यह पुराना है, लेकिन मैं आपके POST के बाद GET का उपयोग करने के लिए एक ठोस तर्क दे सकता हूं। Http / 1.1 युक्ति में कोई भी ऐतिहासिक उपकरण आपके GET प्रतिसाद से वापस प्राप्त की गई कैश सेटिंग्स को अनदेखा कर सकता है ... इसलिए यदि आपका उपयोगकर्ता इस पृष्ठ पर वापस जाने के लिए ब्राउज़र में बैक बटन का उपयोग करता है, तो आप इसे POST के साथ अपडेट करने के बाद इसे बासी का उपयोग कर सकते हैं मूल GET से कैश्ड डेटा। इसलिए यदि आप GET का पुन: उपयोग करते हैं तो आप कैशे को अपडेट कर सकते हैं और बेहतर स्नैपशॉट प्राप्त कर सकते हैं कि पेज को छोड़ते समय पृष्ठ कैसा दिखता है ...
Shaded

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

मैं यहां डैनियल राज्यों की सदस्यता लेता हूं। यहां तक ​​कि अगर आप स्प्रिंग डेटा जैसे परिपक्व फ्रेमवर्क की जांच करते हैं, तो वे इसे बनाए रखने के बाद हमेशा पूरी वस्तु को वापस कर देते हैं। मुझे लगता है कि यह एक अच्छा अभ्यास है, जैसा कि आप ग्राहक के रूप में आप एक ही जानकारी प्राप्त करने के लिए एक सर्वर राउंडट्रिप को
बचाएंगे

205

"यूनिफ़ॉर्म इंटरफेस - रिप्रेजेंटेशन के माध्यम से संसाधनों का हेरफेर।" पूर्ण ऑब्जेक्ट उस नई स्थिति का प्रतिनिधित्व है जिसे बनाया गया था।

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

इसमें आपके प्रश्न का उत्तर शामिल है: अपडेट और निर्माण को संसाधन प्रतिनिधित्व वापस करना चाहिए

इसे कहते हैं:

एक एपीआई उपभोक्ता को अपडेट किए गए प्रतिनिधित्व के लिए फिर से एपीआई को हिट करने से रोकने के लिए, प्रतिक्रिया के हिस्से के रूप में एपीआई को अद्यतन (या निर्मित) प्रतिनिधित्व लौटाएं।

मुझे अच्छी तरह से व्यावहारिक लगता है और यह उस REST सिद्धांत के साथ फिट बैठता है जिसका मैंने ऊपर उल्लेख किया है।


6
कैसे संबंधित वस्तुओं के पूरे सेट को वापस करने के बारे में? इस तरह, संभव छँटाई सर्वर-साइड किया जा सकता है, और यह फ्रंट-एंड कार्यान्वयन को आसान बनाता है
phil294

2
लेकिन ये सर्वोत्तम अभ्यास सर्वोत्तम नहीं हैं। HATEOAS, जो कि अन्य सिद्धांतों के समान महत्वपूर्ण है, लेखक का उपयोग नहीं किया जाना चाहिए क्योंकि "यह तैयार नहीं है"। HATEOAS कभी भी "तैयार" नहीं होगा, क्योंकि सभी Restful सिद्धांत केवल वास्तुशिल्प डिजाइन सिद्धांत हैं, विशिष्ट कार्यान्वयन नहीं। उद्धृत संदर्भ RESTful API के बारे में लेखक की दृष्टि के बारे में है, जो HATEOAS छोड़ने के कारण Restful बिल्कुल नहीं है। यही कारण है कि यह सबसे अच्छा संदर्भ नहीं है :)
marcinn

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

@grahamesd एक क्रियान्वयन एक अलग चीज है जो वास्तुशिल्प डिजाइन priciple / पैटर्न है। कोई भी यह उम्मीद नहीं कर सकता है कि किसी दिन हेटोएएस तैयार हो जाएगा, लेकिन एक मौका है कि कोई व्यक्ति कई लोगों द्वारा स्वीकार्य कार्यान्वयन बनाएगा। विनय ने यूआरएल और विशिष्ट संचालन (सीआरयूडी) के लिए http तरीकों की मैपिंग के बारे में भी लिखा, कहा कि यूआरएल को प्रीफ़िक्स करके संस्करण अधिक व्यावहारिक है, लिखा है कि क्वेरी मापदंडों द्वारा फ़िल्टर करना एक रास्ता है ... यह ठीक है, लेकिन यह सब बहुत कम है रेस्टफुल आर्किटेक्चर के साथ करें। उन्होंने किसी तरह के अनुबंध के बारे में लिखा। HTTP API के लिए यह ठीक है, लेकिन इसे RESTful मत कहिए।
मार्सिन

@grahamesd यहां कुछ पोस्ट समझाए जा रहे हैं: - medium.com/@andrea.chiarelli/… - restfulapi.net
marcinn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.