2014-12-14 2 views
7

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

क्या ऐसी विधि GET या POST होनी चाहिए?

GET में यूआरएल पैरामीटर के बाहर डेटा भेजने का एक अनुशंसित तरीका प्रतीत नहीं होता है, लेकिन विधि का व्यवहार GET का तात्पर्य है, जो HTTP spec के अनुसार सुरक्षित, स्टेटलेस प्रतिक्रियाओं के अनुसार है। यह आरईएसटी के अर्थशास्त्र के तहत विशेष रूप से बाधा बन जाता है, जो दर्शाता है कि POST विधियां सर्वर पर एक नई वस्तु बनाती हैं।

उत्तर

4

यह आरईएसटी के अर्थशास्त्र के तहत विशेष रूप से बाधा बन जाता है, जो दर्शाता है कि POST विधियां सर्वर पर एक नई वस्तु बनाती हैं।

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

इसका मतलब है कि एक POST एक नया संसाधन बना सकते हैं, और निश्चित रूप से ऐसा करने के लिए सबसे अच्छा तरीका है जब यह सर्वर है कि कि नए संसाधन अपने यूआरआई (दे देंगे PUT साथ जब अधिक उपयुक्त विधि से किया जा रहा है क्लाइंट नए यूआरआई को निर्देशित करता है) इसका उपयोग उन वस्तुओं के लिए भी किया जा सकता है जो ऑब्जेक्ट्स को हटाते हैं (हालांकि फिर भी यदि यह एक यूआरआई द्वारा पहचाने जाने वाले एकल * संसाधन को हटाने का है तो DELETE अधिक उपयुक्त है), ऑब्जेक्ट्स बनाएं और हटाएं, एकाधिक ऑब्जेक्ट्स बदलें , इसका मतलब यह हो सकता है कि आपकी रसोई की रोशनी चालू हो जाती है लेकिन प्रतिक्रिया वही होती है चाहे वह काम करता है या विफल रहता है क्योंकि वेबसर्वर से रसोई प्रकाश में संचार सफलता के बारे में प्रतिक्रिया देने की अनुमति नहीं देता है। यह वास्तव में कुछ भी कर सकता है।

लेकिन, अपनी प्रवृत्ति इस चाहने होने के लिए अच्छे हैं एक GET: POST की ढील का मतलब है जब तक हम लगभग हर अनुरोध के लिए इसके लिए एक मामला बना सकते हैं (जैसा कि दृष्टिकोण है कि एक RPC की तरह प्रोटोकॉल के लिए HTTP का उपयोग करके किया , अनिवार्य रूप से HTTP का इलाज करना जैसे कि यह एक परिवहन प्रोटोकॉल था), यह सिद्धांत में अक्षम है, अभ्यास में अक्षम है और परिभाषा में बेकार है। आपके पास एक बेवकूफ कार्य है जो क्लाइंट में रुचि रखने के लिए पूरी तरह से निर्भर करता है, और यह कुछ तरीकों से सबसे स्पष्ट रूप से GET मानचित्र करता है।

हम यूआरआई में सब कुछ फिट सकता है तो GET आसान होगा। उदाहरण के लिए हम एक सरल पूर्णांक के 71 और 2 और इसलिए एक स्थायी अपरिवर्तनीय संख्या 3 (GET के परिणामों के बाद से प्रतिनिधित्व कर समय के साथ एक संसाधन में परिवर्तन के साथ भिन्न हो सकते हैं संसाधन किया जा रहा है इसके अलावा प्रतिनिधित्व करने http://example.net/addInts?x=1;y=2 की तरह कुछ के साथ इसके अलावा परिभाषित कर सकते हैं, लेकिन इस संसाधन कभी नहीं परिवर्तन) और फिर एचटीएमएल के <form> या जावास्क्रिप्ट जैसे तंत्र का उपयोग करें ताकि सर्वर को क्लाइंट को अन्य नंबरों के लिए यूआरआई बनाने के तरीके के बारे में सूचित किया जा सके (HATEOS और/या COD बाधाओं को बनाए रखने के लिए)। साधारण!

आपकी समस्या यह है कि आपके पास इनपुट नहीं है जिसे संक्षेप में 1 और 2 के रूप में प्रदर्शित किया जा सकता है। सिद्धांत रूप में आप http://example.net/photoshoppedCheck?image=data:image/png;base64,iVBORw0KGgoAAAANSU… जैसे कुछ कर सकते हैं और इसलिए एक यूआरआई बना सकते हैं जो चेक के परिणामों के संसाधन का प्रतिनिधित्व करता है। हालांकि इस यूआरआई में छवि में प्रत्येक 3 बाइट्स के लिए 4 वर्ण होंगे। हालांकि यूआरआई की लंबाई पर कोई पूर्ण सीमा नहीं है, सिद्धांत और अभ्यास दोनों इसे असफल होने की अनुमति देते हैं (सिद्धांत रूप में HTTP प्रॉक्सी और सर्वरों को यूआरआई लंबाई पर सीमा निर्धारित करने की अनुमति देता है, और व्यवहार में वे करते हैं)।

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

  1. कुछ वेबसर्वर अनुरोध को अस्वीकार या शरीर पट्टी होगा, ताकि आप करने में सक्षम नहीं हो सकता है।
  2. अपने वेब सर्वर इसे अनुमति होती है, तो तथ्य यह है कि उसके निर्दिष्ट नहीं मतलब है कि आप यकीन है कि एक उन्नत "ठीक" नहीं होगा यह और तो अपने कोड को तोड़ने नहीं हो सकता।
  3. कुछ प्रॉक्सी अनुरोध अस्वीकार या पट्टी कर देंगे।
  4. कुछ क्लाइंट लाइब्रेरी सबसे निश्चित रूप से डेवलपर्स एक GET के साथ एक अनुरोध शरीर भेजने की अनुमति देने से इंकार कर दिया जाएगा।

तो यह दोनों सिद्धांत और व्यवहार में नहीं-नहीं है।

POST से अलग एकमात्र अन्य दृष्टिकोण के बारे में एक यूआरआई होना है जिसे हम फ़ोटोशॉप नहीं किए गए एक छवि का प्रतिनिधित्व करने के रूप में मानते हैं। इसलिए यदि आप GET हैं कि आपको छवि का वर्णन करने वाली इकाई मिलती है (जाहिर है कि यह वास्तविक छवि हो सकती है, हालांकि अगर हम सामग्री-वार्ता की अवधारणा को फैलाते हैं तो यह कुछ और भी हो सकता है) और फिर PUT छवि की जांच करेगा और यदि इसे समझा जाएगा फोटोशॉप नहीं किया गया है, यह एक ही छवि और 200 या सिर्फके साथ प्रतिक्रिया करता है, जबकि इसे फ़ोटोशॉप होने के लिए समझा जाता है, तो यह 400 के साथ प्रतिक्रिया करता है क्योंकि हमने एक फ़ोटोशॉप छवि को संसाधन के रूप में PUT करने का प्रयास किया है जो केवल एक गैर-फ़ोटोशॉप हो सकता है छवि। चूंकि हम तुरंत जवाब देते हैं, एक साथ अनुरोध के साथ कोई दौड़-स्थिति नहीं है।

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

नहीं, यहां जाने के सभी तरीके से POST एक निश्चित यूआरआई की छवि है जो तब विश्लेषण का वर्णन करने वाली एक साधारण इकाई लौटाती है।

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

सभी में, जबकि क्लासिक गलती है कि बाकी से दूर एक वेब अनुप्रयोग से चलता है बिल्कुल सब कुछ कर में POST दुरुपयोग जब GET, PUT और DELETE (और शायद WebDAV विधि) बेहतर होगा, डर मत बनो जब वे बिल को पूरा नहीं करते हैं तो इसकी शक्ति का उपयोग करें, और यह न सोचें कि "संसाधन के नए अधीनस्थ" का अर्थ पूर्ण दीर्घकालिक संसाधन होना है।


* ध्यान दें कि एक "एकल" संसाधन यहाँ कई संसाधनों को अपने स्वयं के यूआरआई हो सकता है से बना जा सकता है, इसलिए एक भी DELETE कि एक से अधिक ऑब्जेक्ट को हटा देता है करने के लिए आसान हो सकता है, लेकिन अगर को हटाने एक्स एक को हटा देता है , बी & सी तो यह बेहतर होगा कि आपके पास ए, बी या सी नहीं हो सकता है यदि आपके पास एक्स नहीं है या आपका एपीआई समझ में नहीं आता है। आम तौर पर यह मॉडलिंग के लिए नीचे आता है, और यह कितना स्पष्ट है कि एक चीज दूसरे पर निर्भर करती है।

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

1

यह एक कठिन है। कई अन्य परिदृश्यों की तरह यह करने का कोई बिल्कुल सही तरीका नहीं है। आपको HTTP के अर्थशास्त्र की सीमाओं के संदर्भ में विश्वसनीय सिद्धांतों की व्याख्या करने की कोशिश करनी है। (संयोग से, मुझे नहीं लगता कि आरईएसटी के अर्थशास्त्र के बारे में सोचने का अधिकार है, आरईएसटी एक वास्तुकला शैली है जिसका उपयोग आमतौर पर HTTP सेवाओं के साथ किया जाता है, लेकिन किसी भी प्रकार के इंटरफ़ेस के लिए इसका उपयोग किया जा सकता है।)

मुझे सामना करना पड़ा है मेरी वर्तमान परियोजना में इसी तरह की स्थिति। हमने POST का उपयोग करना चुना है, लेकिन प्रतिक्रिया कोड (ठीक) के साथ 201 (संसाधन बनाया गया) के बजाय आमतौर पर रीस्टफुल वेब एपीआई द्वारा लौटाया गया है।

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