क्या निकाय निकाय के बिना HTTP POST करने के लिए बुरा व्यवहार माना जाता है?


176

मुझे एक ऐसी प्रक्रिया को लागू करने की आवश्यकता है जिसके लिए उपयोगकर्ता से किसी भी इनपुट की आवश्यकता नहीं है, बस एक ट्रिगर। मैं इस प्रक्रिया को ट्रिगर करने के लिए शरीर के बिना POST / uri का उपयोग करने की योजना बना रहा हूं। मैं जानना चाहता हूं कि क्या यह HTTP और REST दोनों दृष्टिकोणों से बुरा माना जाता है?


6
आपके सुझावों के लिए सभी का धन्यवाद। हालाँकि हर किसी ने समान सुझाव दिया है अर्थात शून्य सामग्री के साथ POST करना ठीक है, IETF चर्चा के लिंक के कारण मैं डारेल के उत्तर को सही मान रहा हूं। चर्चा बहुत कुछ स्पष्ट करती है।
सुरेश कुमार

जवाबों:


155

मैंने कुछ महीने पहले IETF HTTP वर्किंग ग्रुप पर यह सवाल पूछा था। संक्षिप्त उत्तर है: नहीं, यह एक बुरा अभ्यास नहीं है (लेकिन मैं अधिक जानकारी के लिए थ्रेड को पढ़ने का सुझाव देता हूं)।


4
कोई भी अद्यतन स्रोत जो 10 साल बाद पुष्टि करेगा?
बैप्टिस्ट पेरनेट

79

एक GET के बजाय एक POST का उपयोग करना पूरी तरह से उचित है, क्योंकि यह सर्वर (और रास्ते के साथ प्रवेश द्वार) को भी निर्देश देता है कि कैश्ड प्रतिक्रिया न दें।


50

POST पूरी तरह से ठीक है। POST के साथ GET के अंतर में आप सिस्टम की स्थिति बदल रहे हैं (सबसे अधिक संभावना है कि आपका ट्रिगर "कुछ कर रहा है और डेटा को बदल रहा है")।

मैंने पहले ही पेलोड के बिना POST का उपयोग किया और यह "ठीक" लगता है। पेलोड के बिना POST का उपयोग करते समय आपको एक बात करनी चाहिए: शीर्ष लेख पास करें Content-Length: 0। जब मैं एपीआई-क्लाइंट इसे पास नहीं करता था तो मुझे कुछ समस्‍याओं के साथ समस्‍या होती है।


16

यदि आप शरीर के बिना POST / uri का उपयोग करते हैं, तो यह एक फ़ंक्शन का उपयोग करने जैसा कुछ है जो एक तर्क नहीं लेता है ।eg int पोस्ट (शून्य); इसलिए अपने संसाधन वर्ग के लिए कार्य करना उचित है जो किसी तर्क के बिना किसी वस्तु की स्थिति को बदल सकता है। यदि आप एक यूआरआई के लिए यूनिक्स स्पर्श फ़ंक्शन को लागू करने पर विचार करते हैं, तो क्या यह अच्छा विकल्प नहीं है?


6
स्पर्श / अंगुली एक पाठ्यपुस्तक चित्रण एक गैर-निष्पादनीय कार्रवाई है जो स्वाभाविक रूप से सामग्री-कम है।
क्रिस मैरिसिक

2

हां, शरीर के बिना POST अनुरोध भेजना ठीक है और इसके बजाय क्वेरी स्ट्रिंग मापदंडों का उपयोग करें। लेकिन सावधान रहें अगर आपके मापदंडों में ऐसे अक्षर हैं जो HTTP मान्य नहीं हैं तो आपको उन्हें एनकोड करना होगा।

उदाहरण के लिए यदि आपको 'हैलो दुनिया' को पोस्ट करने की आवश्यकता है और अंत में आपको इसे इस तरह दिखना होगा: http://api.com?param=hello%20world


0

इस मामले में POST के ठीक होने के जवाब के लिए समर्थन यह है कि पायथन के मामले में, OpenAPI ढांचा "FastAPI" एक स्वैगर GUI (छवि देखें) उत्पन्न करता है जिसमें एक शरीर खंड नहीं होता है जब एक विधि (नीचे उदाहरण देखें) एक शरीर को स्वीकार करने के लिए एक पैरामीटर है।

विधि "post_disable_db" सिर्फ एक पथ पैरामीटर "db_name" को स्वीकार करती है और इसमें दूसरा पैरामीटर नहीं होता है जो एक अनिवार्य निकाय होता है।

@router.post('/{db_name}/disable',
             status_code=HTTP_200_OK,
             response_model=ResponseSuccess,
             summary='',
             description=''
             )
async def post_disable_db(db_name: str):
    try:
        response: ResponseSuccess = Handlers.databases_handler.post_change_db_enabled_state(db_name, False)
    except HTTPException as e:
        raise (e)
    except Exception as e:
        logger.exception(f'Changing state of DB to enabled=False failed due to: {e.__repr__()}')
        raise HTTPException(HTTP_500_INTERNAL_SERVER_ERROR, detail=e.__repr__())

    return response

यहां छवि विवरण दर्ज करें

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