2011-11-15 29 views
16

this okuyordum, ancak gerçekten de yönlendirme isteğinin ne tür bir istekte olması gerektiğinden, yani (başlangıç ​​isteği türü, yanıt tipi) -> yönlendirme isteği türü gibi bir işlev istemedim. Benim özel durumdaHTTP: Yönlendirme isteği bir GET olması gerektiğinde, POST isteği 302 alır.

, ben:

  • ilk istek tipi: POST
  • tepki tipi: 302

Google Chrome yönlendirildi istek için bir GET kullanılır. Python kütüphanesinde requests yılında

aşağıdaki kodu ( here) vardır:

# 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 

Yani, yönlendirme-istek türü öyle diğer tüm durumlarda, 303 (codes.see_other) durumunda GET olduğunu ilk istek tipi. Örneğin, yukarıdaki özel durumum için Chrome'un tersine POST olacaktır.

Muhtemelen yanlış bir şey var çünkü bu gerçekten doğru çalışmıyor gibi görünüyor bir web sitesi var (yani web sitesi bu şekilde iyi davranmıyor).

Doğru yol/işlev ne olurdu?

cevap

1

303 ve 307 haricinde, ya tarihsel nedenlerden dolayı spec'a göre davranış kabul edilebilir.

Sadece Chrome'da ilgili kod aramış
+1

Belki de, her tarayıcı farklı davranıyor gibi görünüyor ve web siteleri bu şekilde çalışmıyorsa, o kadar sıkı takip etmemiz akıllıca olabilir. – Albert

+0

Eh, belki de kesinlikle teknik özellikleri takip etmek ve her tarayıcı firmanın teknik özelliklerine uyması akıllıca olur mu? –

+0

Buradaki spec oldukça yumuşaktır. –

14

ve here öyle: RFC 2616 Per

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

Bu sorunun cevabının, Chrome ve düğüm istekleriyle karşılaştıktan sonra olduğunu ve başlangıçta tamamen normal olduğunu varsayarak düşündüm. Sonra "tarihsel" olsa da, muhtemelen "doğru" olmadığını düşündüm. Bu yüzden bu sayfayı buldum ve "doğru" olmanın "tarihsel" uygulamalarla uyumlu olmaktan daha az önemli olduğu kulağa ... bir dakika için hayal kırıklığı yarattı. Sonra, gördüğüm her "geleneksel", Ajax/API olmayan form tabanlı "POST" un bir GET'i kabul eden bir yönlendirmeyle yanıt verdiğini hatırlıyorum.

Bu, öyle ve muhtemelen hiç değişmiyor. Tüm ilgili bilgileri sağlamak için önceki tüm cevaplayanlara teşekkürler.