2010-01-15 11 views
19

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

1) मेरा पहला विचार सर्व यूआरआई और increase the max URI length सर्वलेट कंटेनर का उपयोग करना था।

यह इस तरह दिखेगा:

GET http://some.test/myresource?query={really big JSON object} 

लेकिन ऐसा लगता है कि यूआरआई 2 से अधिक समय KB वर्ष प्रॉक्सी सर्वर की वजह से विश्वसनीय नहीं हैं (यह सही है?)।

2) मेरा कामकाज पहले पोस्ट के माध्यम से अस्थायी संसाधन बनाना है और वास्तविक संसाधन अनुरोध में पैरामीटर के रूप में इस संसाधन के यूआरआई का उपयोग करना है। यही कारण है कि इस प्रकार दिखाई देगा:

POST http://some.test/temp 
Request Body: {really big JSON object} 

201 Created Location: http://some.test/temp/12309871 

GET http://some.test/myresource?query=http://some.test/temp/12309871 

3) GET अनुरोध का प्रयोग शरीर। मैंने सवाल के जवाब पढ़े हैं कि प्रश्न के लिए जीईटी अनुरोध के शरीर का उपयोग करना एक अच्छा विचार है, और सर्वसम्मति है: नहीं। यहां तक ​​कि रॉय फील्डिंग का कहना है कि यह bad idea है।

4) POST को "परिणाम परिणाम संसाधन बनाएं" के रूप में व्याख्या करने और अनुरोध के बाद इस संसाधन को हटाने के लिए एक और दृष्टिकोण हो सकता है। लेकिन मैं मानता हूं कि भरोसेमंद नहीं होना चाहिए और एक बुरा विचार होना चाहिए।

क्या GET अनुरोधों के साथ बड़े प्रश्नों को संभालने का कोई बेहतर तरीका है?

+0

हाँ, 'पुट' के साथ। गहन व्याख्या के लिए मेरा उत्तर देखें – Ray

उत्तर

3

मैंने सोचा कि आरईएसटी में पूरा बिंदु "दस्तावेज" (या कुछ समान) पर काम करना था। अनुरोध के यूआरआई भाग विशिष्ट रूप से पर काम करने के संसाधन की पहचान करने के लिए है। इसके विपरीत शरीर भाग भाग के "सामग्री" भाग के लिए है।

इसलिए, अनुरोध के "बॉडी" भाग का उपयोग करें।

यह भी ध्यान रखें कि "GET" अनुरोध के अर्थशास्त्र का उपयोग "पुटिंग" या "पोस्टिंग" दस्तावेज़ों के लिए नहीं किया जाना चाहिए (उपरोक्त "क्वेरी" उदाहरण के संबंध में टिप्पणी जो किसी ऑब्जेक्ट को "बनाना")।

किसी भी मामले में, जैसा कि आपने बताया है, यूआरआई हिस्सा सीमित है (अच्छे कारण के लिए मुझे यकीन है)।


आप कैशिंग के साथ संबंध रहे हैं, तो ETag/Last-Modified क्षेत्रों के उपयोग ("सशर्त प्राप्त" के साथ संयोजन के रूप में इस उद्देश्य के लिए मदद करता है।

+2

यह सब नियमों के भीतर है, लेकिन जीईटी अनुरोध के शरीर का उपयोग करने में कुछ गंभीर नुकसान हैं। कुछ इस एसओ पोस्ट में समझाए गए हैं: http://stackoverflow.com/questions/978061/ –

+1

यदि आप स्थानांतरण लागत को कम करने के लिए कैशिंग का जिक्र कर रहे हैं: आपको किसी भी तरह एटाग/अंतिम-संशोधित हेडर फ़ील्ड का उपयोग करना चाहिए जो इस उद्देश्य को पूरा करता है। "सशर्त जीईटी" इस उद्देश्य के लिए मदद करता है। – jldupont

+0

आज "बिना किसी टिप्पणी के ड्राइव-डाउन-वोट" के साथ क्या है ??? – jldupont

-1

तुम सिर्फ बड़ा JSON नहीं भेज सकता अस्थायी संसाधन बनाने के बजाए जीईटी अनुरोध निकाय के साथ डेटा?

हालांकि यह 100% कोशेर नहीं है, लेकिन मुझे लगता है कि यह फ़ायरफ़ॉक्स और आईई और आईएमओ के साथ अच्छी तरह से काम करता है, क्वेरीस्ट्रिंग सुरुचिपूर्ण है और आम तौर पर कार्यान्वयन के विवरण का खुलासा करती है यूआरआई में नहीं है। बस एक कैश बस्टर querystring पैरामीटर जोड़ने के लिए सुनिश्चित करें यदि आपको अद्यतित डेटा की आवश्यकता है क्योंकि सर्वर wil यह निर्धारित करते समय डेटा को अनदेखा करें कि क्या यह कैश प्रतिक्रिया लौटा सकता है या नहीं।

GET अनुरोध निकाय में डेटा भरने के पेशेवरों और विपक्ष की चर्चा के लिए here देखें।

+1

चर्चा के लिंक के लिए धन्यवाद। लगता है कि जीईटी + अनुरोध निकाय एक अच्छा विचार नहीं है। – deamon

+0

तकनीकी रूप से प्राप्त करने के लिए शरीर नहीं है, लेकिन रीस्ट तकनीकी रूप से कोई खोज नहीं है, इसलिए .... +1 –

3

यदि आप बड़ी वस्तुओं को भेजने के लिए जीईटी अनुरोध का उपयोग कर रहे हैं, तो आप आरईएसटी का सही उपयोग नहीं कर रहे हैं।

  • प्राप्त संसाधनों को पुन: प्राप्त
  • पोस्ट
  • PUT इस्तेमाल किया जाना चाहिए (सामग्री शरीर में) के साथ बनाने संसाधनों के लिए इस्तेमाल किया जाना चाहिए (अद्वितीय पहचानकर्ता के कुछ प्रकार के माध्यम से) के लिए इस्तेमाल किया जाना चाहिए के लिए
  • DELETE एक संसाधन
को हटाने के लिए इस्तेमाल किया जाना चाहिए (शरीर में सामग्री के साथ) एक संसाधन अद्यतन करने

यदि आप इन दिशानिर्देशों का पालन करते हैं तो आपको कभी भी लंबे समय तक यूआरआई नहीं रखना पड़ेगा।

कुछ सबसे अच्छा अभ्यास बाकी दिशा निर्देशों यहां हैं: http://www.xml.com/pub/a/2004/08/11/rest.html

+1

आपको जीईटी के माध्यम से संसाधन को पुनर्प्राप्त करने के तरीके के लिए पैरामीटर निर्दिष्ट करने की आवश्यकता हो सकती है (उदाहरण के लिए, 'खाली फ़ील्ड' या 'संपीड़न डेटा' या 'संपादन के लिए खुला' शामिल करें) यहां सवाल यह है कि उन पैरामीटर को कैसे पास किया जाए, न कि http क्रिया का उपयोग करने के लिए। –

+3

पैरामीटर निर्दिष्ट करना ठीक है, लेकिन यदि आपको ~ 2 केबी के पैरामीटर की आवश्यकता है तो आपके पास एक बुरी तरह से डिज़ाइन की गई आरईएसटी सेवा है! – DanSingerman

+0

मैं आपसे सहमत हूं, लेकिन सूची सूची और पैराम्स के साथ क्या है जो इस सूची को फ़िल्टर करते हैं? मेरे मामले में ये फ़िल्टर स्थितियां वास्तव में बड़ी हो सकती हैं और मुझे नहीं पता कि उन्हें कैसे बचें। मैं फिल्टर के बिना छोटे पहचानकर्ताओं के साथ काम नहीं कर सकता। – deamon

2

यहाँ अपने दूसरे विकल्प पर एक मामूली बदलाव है। QueryMaker नामक एक प्रोसेसर संसाधन बनाएं। अपने पैरामीटर को पोस्ट करें और इसे आपको अस्थायी क्वेरी संसाधन पर रीडायरेक्ट करने दें जो आपके परिणाम लौटाएगा।

POST /QueryMaker 
Body: Big Json representation of parameters 

303: See Other 
Location: http://example.org/TemporaryQueries/123213 
0

खुला वेब पर यूआरएल लंबाई की सबसे बड़ी सीमा वास्तव में आईई, जो constraints them to 2083 characters है।

कुछ प्रॉक्सी (उदाहरण के लिए, स्क्विड के सबसे हाल के संस्करणों के अलावा सभी) उन्हें लगभग 4k तक सीमित कर देंगे, हालांकि यह moving towards 8k slowly है।

आपके # 2 वर्कअराउंड आपके उपयोग के मामले के आधार पर एक अच्छा दृष्टिकोण है।

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

3

PUT का उपयोग करें।

क्यों? निम्नलिखित कारणों के लिए:

  • बस क्रिया PUT 'अपडेट कर सकते हैं' संसाधन क्योंकि, इसका मतलब यह नहीं है कि यह होगा या संसाधन की अंतर्निहित स्थिति में परिवर्तन करना होगा।
  • कोई नया संसाधन पहचानकर्ता (यूआरएल) PUT के एपीआई पक्ष द्वारा बनाया जाना चाहिए। हां, तकनीकी रूप से PUT क्लाइंट निर्दिष्ट पहचानकर्ता के साथ संभव है, लेकिन इस मामले में आप मौजूदा संसाधन को मार रहे हैं।
  • PUTGET इस तथ्य में है कि यह बेवकूफ होना चाहिए, जिसका अर्थ है कि अनुरोध के परिणाम हमेशा इस बात पर ध्यान दिए बिना होंगे कि आप इसे कितनी बार कहते हैं और इसका कोई दुष्प्रभाव नहीं है।

PUT का अर्थ है कि आप संसाधन डेटा को मौजूदा संसाधन में डाल रहे हैं। दस्तावेज़/ब्लॉग पोस्ट दुनिया में किसी आलेख या पोस्ट के संदर्भ में, यह किसी मौजूदा संसाधन URL पर कुछ दस्तावेज़ों का एक नया संशोधन अपलोड करना होगा। यदि आप एक ही यूआरएल में एक ही संशोधन अपलोड करते हैं, तो आपके द्वारा वापस आने वाले संसाधन में कुछ भी नहीं बदला जाना चाहिए।

आपके मामले में, भौगोलिक डेटा कुछ नया संसाधन डेटा है जिसे आप अपलोड कर रहे हैं और परिणाम मिलने पर आप वही अनुरोध करते हैं जब भी आप वही अनुरोध करते हैं।

एक और अधिक शुद्धतावादी विधि हो सकता है अनुरोध के लिए GET क्रिया का उपयोग करें:

  • एक प्रश्न संसाधन प्रकार
  • पोस्ट एक प्रश्न संसाधन समाप्ति बिंदु को क्वेरी विवरण की JSON सेट के लिए एक अंत बिंदु बना सकते हैं और प्राप्त क्वेरी संसाधन के लिए एक पहचानकर्ता (यह 123 के एक प्रश्न आईडी रिटर्न कहते हैं)
  • एक प्रश्न पहचानकर्ता जमा प्राप्त करने के लिए अनुरोध http://some.test/myresource?query_id=123
  • क्वेरी संसाधन हटाएँ 123

मैं शुद्ध विधि शरीर में क्वेरी संसाधन डेटा के साथ PUT का उपयोग कर अधिक से अधिक भूमि के ऊपर देखते हैं।

+0

मुझे लगता है कि यह जवाब अच्छा है। यह व्यावहारिक है और बुनियादी आरईएसटी प्रिंसिपल के साथ इनलाइन रखता है। –

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