2011-11-15 19 views
16

मैं this पढ़ रहा था, लेकिन मुझे वास्तव में वहां से कोई अनुरोध नहीं मिला-किस प्रकार रीडायरेक्ट-अनुरोध के मामले में होना चाहिए, यानी फ़ंक्शन (प्रारंभिक अनुरोध-प्रकार, प्रतिक्रिया-प्रकार) -> रीडायरेक्ट-अनुरोध-प्रकार।HTTP: POST अनुरोध को 302 प्राप्त होता है, क्या रीडायरेक्ट-अनुरोध प्राप्त होना चाहिए?

मेरी विशेष मामले में, मैं था:

  • प्रारंभिक अनुरोध प्रकार: पोस्ट
  • प्रतिक्रिया प्रकार: 302

गूगल क्रोम पुनः निर्देशित अनुरोध के लिए एक प्राप्त करते थे।

अजगर पुस्तकालय requests में, वहाँ निम्नलिखित कोड (here) है:

# http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 
if r.status_code is codes.see_other: 
    method = 'GET' 
else: 
    method = self.method 

Ie, रीडायरेक्ट-अनुरोध प्रकार 303 (codes.see_other) के मामले में मिलता है, अन्य सभी मामलों में यह है में है प्रारंभिक अनुरोध-प्रकार। यानी, मेरे विशेष मामले के ऊपर, यह क्रोम के विपरीत, पोस्ट होगा।

यह शायद गलत है क्योंकि मेरे पास एक ऐसी वेबसाइट है जहां यह वास्तव में सही काम नहीं कर रहा है (यानी वेबसाइट इस तरह से अच्छा व्यवहार नहीं करती है)।

सही तरीका/कार्य क्या होगा?

उत्तर

8

प्रति RFC 2616, जवाब है "मूल विधि" है। HTTPbis इसे संशोधित करेगा, क्योंकि यह दर्शाता है कि ब्राउज़र क्या करते हैं (दुख की बात है)।

इतिहास के लिए http://trac.tools.ietf.org/wg/httpbis/trac/ticket/160 देखें।

1

303 और 307 के अलावा, या तो व्यवहार spec के अनुसार मुख्य रूप से ऐतिहासिक कारणों से स्वीकार्य है।

+1

अच्छा, शायद यह समझना बुद्धिमानी नहीं है कि प्रत्येक ब्राउज़र अलग व्यवहार करता है और वेबसाइटें इस तरह से काम नहीं करती हैं? – Albert

+0

अच्छा, हो सकता है कि यह कल्पना का सख्ती से पालन करना और हर ब्राउज़र के विक्रेता को कल्पना का सम्मान करना बुद्धिमान हो? –

+0

कल्पना यहां बल्कि लचीला है। –

14

मैं सिर्फ क्रोम में प्रासंगिक कोड के लिए खोज की है, और here यह है:

std::string ComputeMethodForRedirect(const std::string& method, 
            int http_status_code) { 
    // For 303 redirects, all request methods except HEAD are converted to GET, 
    // as per the latest httpbis draft. The draft also allows POST requests to 
    // be converted to GETs when following 301/302 redirects, for historical 
    // reasons. Most major browsers do this and so shall we. Both RFC 2616 and 
    // the httpbis draft say to prompt the user to confirm the generation of new 
    // requests, other than GET and HEAD requests, but IE omits these prompts and 
    // so shall we. 
    // See: 
    // https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-17#section-7.3 
    if ((http_status_code == 303 && method != "HEAD") || 
     ((http_status_code == 301 || http_status_code == 302) && 
     method == "POST")) { 
    return "GET"; 
    } 
    return method; 
} 
0

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

यह वही है और यह शायद कभी नहीं बदल रहा है। सभी प्रासंगिक जानकारी प्रदान करने के लिए पिछले सभी उत्तरदाताओं के लिए धन्यवाद।