2009-08-05 9 views
54

मुझे मानक में इस बारे में एक निश्चित विनिर्देश ढूँढने में परेशानी हो रही है। मेरे पास एक HTTP क्लाइंट है जिसमें PUT अनुरोध करते समय 'सामग्री-लंबाई: 0' शीर्षलेख शामिल नहीं है, जहां मैं कोई बॉडी निर्दिष्ट नहीं करता हूं, और एक सर्वर जो ऐसे अनुरोधों से भ्रमित हो जाता है, और मुझे आश्चर्य है कि मुझे कौन सा प्रोग्राम चाहिए दोष दे रहा हूँ।क्या एक HTTP पुट अनुरोध शरीर को शामिल करने के लिए आवश्यक है?

उत्तर

46

HTTP अनुरोधों में एक बॉडी है यदि उनके पास सामग्री-लंबाई या स्थानांतरण-एन्कोडिंग हेडर (RFC 2616 4.3) है। अगर अनुरोध में न तो है, तो उसके पास कोई शरीर नहीं है, और आपके सर्वर को इसका इलाज करना चाहिए।

यह कहा गया कि पुट अनुरोध के लिए कोई शरीर नहीं है, और इसलिए यदि मैं एक क्लाइंट को डिजाइन कर रहा था जो वास्तव में एक खाली निकाय भेजना चाहता था, तो मैं सामग्री-लंबाई पास कर दूंगा: 0. दरअसल, किसी के आधार पर POST और PUT विधि परिभाषाओं को पढ़ना (RFC 2616 9.5, 9.6) कोई तर्क दे सकता है कि शरीर को आवश्यक होने के लिए निहित किया गया है - लेकिन किसी भी शरीर को संभालने का उचित तरीका शून्य-लंबाई वाले शरीर को मानना ​​नहीं होगा।

2

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

बेशक, आप सर्वर पर कुछ भी नहीं करना चाहते थे, इस मामले में आप शायद इसके बजाय एक DELETE चाहते हैं।

34

नहीं सवाल का जवाब है, लेकिन जोर देते हुए कैसे jaxrs मुझे bodyless डालता का लगातार उपयोग करने के लिए अनुमति देता है:

bodyless पुट का उदाहरण: उपयोगकर्ता एक अतिरिक्त अनुमति दे।

PUT/व्यवस्थापक/उपयोगकर्ता/{username}/अनुमति/{अनुमति}

+1

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

1

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

int x; 
int f(){ return x; } 

और एक रिमोट r बुलाया चर थे, तो।

एक पोस्ट

r=f(); 

के बराबर एक पुट

r=x; 

के बराबर है और एक प्राप्त

x=r; 
+0

यह पुट बनाम पोस्ट का सबसे स्पष्ट उदाहरण है जिसे मैंने कभी पढ़ा है, हालांकि विषय से बाहर –

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