2013-05-03 12 views
12

मैं एक एपीआई डिजाइन कर रहा हूं और मुझे आश्चर्य है कि जीईटी अनुरोध पर JSON पेलोड भेजने के लिए ठीक है या नहीं?HTTP अनुरोध पेलोड प्राप्त करें

यह अन्य प्रश्न Payloads of HTTP Request Methods में, हम this link के अनुसार पा सकते हैं:

  • प्रमुख - कोई परिभाषित शरीर अर्थ विज्ञान।
  • प्राप्त करें - कोई परिभाषित शरीर अर्थशास्त्र नहीं।
  • पुट - बॉडी समर्थित है।
  • पोस्ट - बॉडी समर्थित है।
  • DELETE - कोई परिभाषित शरीर अर्थशास्त्र नहीं।
  • ट्रेस - बॉडी समर्थित नहीं है।
  • विकल्प - बॉडी समर्थित है लेकिन कोई अर्थशास्त्र नहीं (शायद भविष्य में)।

क्या इसका मतलब है कि मुझे एक पेलोड के साथ एक GET अनुरोध नहीं भेजना चाहिए? क्या ऐसा करने के जोखिम हैं?

  • कुछ HTTP क्लाइंट पुस्तकालयों को ऐसे पेलोड भेजने में असमर्थ होने की तरह?
  • या मेरा जावा एपीआई कोड कुछ एप्लिकेशन सर्वर पर पोर्टेबल नहीं है?
  • और कुछ और?

मुझे पता चला कि ElasticSearch GET अनुरोध पर इस तरह के एक पेलोड उपयोग कर रहा था:

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{ 
    "query": { 
     "filtered" : { 
      "query" : { 
       "query_string" : { 
        "query" : "some query string here" 
       } 
      }, 
      "filter" : { 
       "term" : { "user" : "kimchy" } 
      } 
     } 
    } 
} 
' 

तो यह लोकप्रिय पुस्तकालय यह करता है और कोई भी शिकायत है, तो शायद मैं भी ऐसा कर सकते हैं?

वैसे, मुझे पता है कि अगर यह क्वेरी स्ट्रिंग पैरामीटर और JSON पेलोड मिश्रण करने के लिए ठीक है चाहते हैं? बिल्कुल इस लोचदार खोज क्वेरी की तरह करता है। यदि हां, तो वहाँ के नियम हम जानते हैं ताकि जो तर्क पैरामीटर या पेलोड पैरामीटर क्वेरी स्ट्रिंग किया जाना चाहिए रहे हैं?


यहाँ हम पढ़ सकते हैं: GET अनुरोध के साथ एक शरीर सहित लगभग HTTP GET with request body

रॉय फील्डिंग की टिप्पणी।

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

तो, हाँ, यदि आप एक शरीर मिलता है के साथ भेज सकते हैं और नहीं, यह के लिए उपयोगी नहीं है ऐसा करते हैं।

यह HTTP/1.1 के स्तरित डिज़ाइन का हिस्सा है जो spec विभाजन के बाद फिर से स्पष्ट हो जाएगा (प्रगति पर काम)।

.... रॉय

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


मैं एक एपीआई जो इस तरह कहा जा सकता है डिजाइन करने के लिए योजना बना रहा हूँ:

curl -XGET 'http://localhost:9000/documents/inbox?pageIndex=0&pageSize=10&sort=title' 

curl -XGET 'http://localhost:9000/documents/trash?pageIndex=0&pageSize=10&sort=title' 

curl -XGET 'http://localhost:9000/documents/search?pageIndex=0&pageSize=10&sort=title' -d '{ 
    "someSearchFilter1":"filterValue1", 
    "someSearchFilter2":"filterValue2", 
    "someSearchFilterList": ["filterValue3","xxx"] 
    ... a lot more ... 
} 
' 

यह आप पर ठीक लग रहा है? उपरोक्त विचारों के आधार पर


+1

एक जोखिम हो सकता है कि क्लाइंट लाइब्रेरी पेलोड एक जीई में भेजे जाने के लिए अनुमति नहीं होगी टी अनुरोध मुझे यह भी एहसास नहीं हुआ कि आप इसे ईमानदारी से कर्ल के साथ कर सकते हैं। – bdkosher

उत्तर

1

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

+0

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

+0

के आधार पर कैशिंग नहीं कर सकता हूं क्या सभी मध्यवर्ती/पुस्तकालय भी इसके बारे में जानते हैं? –

+0

निश्चित रूप से क्योंकि उन्हें OAuth2 टोकन तक पहुंच प्राप्त करने की आवश्यकता है जो उन्हें उपयोगकर्ता खाते में हेरफेर करने की अनुमति देता है। इस प्रकार/प्रोफाइल संसाधन उपयोगकर्ता प्रोफ़ाइल है जिसके लिए क्लाइंट OAuth2 टोकन (हेडर के रूप में दिया गया है) –

1

Google App Engine, एक लोकप्रिय वेब ढांचा, एक विशेष यूआरएल फ़ेच लाइब्रेरी का उपयोग करता है, जो does not support making HTTP GET requests with a payload है। तदनुसार, यदि आप चाहते हैं कि आपका एपीआई Google App Engine उपयोगकर्ताओं तक पहुंच जाए, तो मैं इस व्यवहार की आवश्यकता की अनुशंसा नहीं करता।

मैंने Google के साथ an issue regarding this खोला है।

+0

ध्यान दें कि यदि आपको 'GET' अनुरोध करने की आवश्यकता है, तो आप अनुरोध के निकाय के साथ इसे भेजने के बजाय' स्रोत 'क्वेरी-स्ट्रिंग पैरामीटर में अनुरोध के बॉडी को urlencode कर सकते हैं। –

0

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

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

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

1

यह भी देखें: HTTP GET with request body - इस पर अधिक जानकारी के लिए।

सार है: हाँ आप कर सकते हैं, लेकिन आप शायद चाहिए नहीं सहित कई कारणों के लिए:

  • आप की संभावना को अनदेखा कर रहे HTTP कल्पना सिफारिशों (आप शायद पोस्ट करना चाहते हैं)
  • आप कर सकते हैं परिचय कैशिंग मुद्दों
  • यह वह जगह है नहीं सहज जहाँ तक बाकी एपीआई जाना
संबंधित मुद्दे