क्या शरीर को शामिल करने के लिए HTTP PUT अनुरोध आवश्यक है?


92

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


यदि मैं पूछ सकता हूं तो आप 2009 से एक प्रश्न क्यों संपादित करेंगे?
zmuci

@zmuci बेहतर प्रारूपण के लिए?
Константин Ван

जवाबों:


83

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

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


HTTP स्थिति कोड 200 ("ओके"), 201 ("निर्मित"), और 204 ("नो कंटेंट") के रूप में, एक PUTअनुरोध मूल रूप से सर्वर पर फ़ाइल बनाने या अपडेट करने के लिए है। और फ़ाइल के खाली होने के बारे में कुछ भी नाजायज नहीं है, है ना?
Константин Ван


5
@bdonlan आपने कहा कि खाली शरीर वाला PUT असामान्य है, लेकिन अगर मैं किसी उपयोगकर्ता को सक्षम या अक्षम करना चाहता हूं तो मुझे अपने अनुरोध पर निकाय की आवश्यकता नहीं होगी, वास्तव में PUT अनुरोध "/ उपयोगकर्ता / {आईडी} / सक्षम" हो सकते हैं या "/ उपयोगकर्ता / {आईडी} / अक्षम"।
विनीसियस डे अल्मेडा

@ViniciusdeAlmeida यदि आप REST मानकों का पालन करने का प्रयास कर रहे हैं तो वे संसाधन उपयुक्त नहीं होंगे। disableऔर enableक्रिया हैं। मैं शायद उस मामले में समापन बिंदु PATCHपर उपयोग करना पसंद करूंगा /users/{id}
क्रश करें

42

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

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

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


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

मैं इसी तरह के मामले में हूं, मुझे एक मौजूदा संसाधन को एक उपयोगकर्ता से जोड़ने के लिए एपीआई की आवश्यकता है। मैं शरीर में एक POST उपयोगकर्ता /: userId / resourceId के साथ संसाधनों का उपयोग कर सकता हूं। या इसके बजाय यह एक PUT उपयोगकर्ता /: userid / Resources /: resourceId फिट होगा। यहाँ बड़ा अंतर यह है कि firt API को नॉन-इम्पोटेंट माना जाता है, इसलिए मैं एक उपयोगकर्ता के लिए एक ही संसाधन को दो बार जोड़ सकता था। PUT कॉल को पिछले संघ को रीसेट करना चाहिए
कारमाइन इंग्लैडी

5

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

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

और एक दूरस्थ चर कहा जाता है r

एक पद के बराबर है

r=f();

एक पुट के बराबर होता है

r=x;

और एक मिल के बराबर है

x=r;

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

यदि अनुरोध में सामग्री-लंबाई शीर्ष लेख है, तो इसका एक निकाय है। यह एक खाली शरीर हो सकता है, लेकिन फिर भी एक शरीर है। कंटेंट-लेंथ हेडर वाले एक अनुरोध के विपरीत, जिसमें कोई शरीर नहीं है, यहां तक ​​कि एक खाली भी नहीं। तो हाँ, एक PUT अनुरोध, तकनीकी रूप से, सख्ती से, एक शरीर होना चाहिए। हमेशा।
पॉल ग्रोके

इसके अलावा आपका POST सादृश्य मेरे लिए पूरी तरह से भ्रमित है। अगर मैं आपकी बाकी सादृश्यता के साथ रहने की कोशिश करता हूं, तो यह अधिक होना चाहिए जैसे कि सर्वर के पास एक है int f(int* resource, int body);और फिर POST आह्वान करेगा f(&r, x);- जो rभी सर्वर उचित समझता है वह कर सकता है या नहीं कर सकता है । लेकिन यह सामान भी लौटा सकता है, इसलिए ... शायद अधिक पसंद करें y = f(&r, x);
पॉल ग्रूके

0

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

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


1
क्या आपके यूआरएल हो सकता है डाल बल्कि शरीर की तुलना में इनकोडिंग
MikeT

1
PUT खाली केवल यह घोषित कर रहा है कि दी गई पहचान वाला संसाधन सर्वर पर मौजूद होना चाहिए, हालांकि इसमें पहचान के अलावा कोई सामग्री नहीं है। यह DELETE से पूरी तरह से अलग शब्दार्थ है।
इमरू पुहवेल

कल्पना कीजिए कि आप एक संसाधन को प्राप्त करना चाहते हैं लेकिन सभी सर्वर-साइड डिफॉल्ट को स्वीकार करते हैं। यह शरीर के रूप में Content-Length: 0या { }JSON में होगा?
ल्यूक पुप्लेट ने

1
तो आपके पास आपके कंप्यूटर पर एक भी खाली फाइल नहीं है , क्या आप?
Константин Ван

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.