2011-11-15 20 views
16

Stavo leggendo this ma in realtà non ho ricevuto da quale tipo di richiesta dovrei avere la richiesta di reindirizzamento, in questo caso, cioè la funzione (tipo di richiesta iniziale, tipo di risposta) -> redirect-request-type.HTTP: la richiesta POST riceve un 302, se la richiesta di reindirizzamento è una GET?

Nel mio caso particolare, ho avuto:

  • iniziale richiesta-tipo: POST
  • risposta-tipo: 302

Google Chrome utilizzato un GET per la richiesta reindirizzata.

Nella libreria Python requests, v'è il seguente codice (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 

Cioè, il reindirizzamento-request-type è GET in caso di 303 (codes.see_other), in tutti gli altri casi è il tipo di richiesta iniziale. Ad esempio, per il mio caso particolare sopra, sarebbe POST, in contrasto con Chrome.

Questo è probabilmente sbagliato perché ho un sito Web in cui questo in realtà non sembra funzionare correttamente (ad esempio il sito Web non si comporta bene in questo modo).

Quale sarebbe il modo corretto/la funzione?

risposta

1

Tranne per 303 e 307, entrambi i comportamenti sono accettabili come da spec, principalmente per ragioni storiche.

+1

Beh, forse è più saggio non seguire le specifiche in modo rigoroso se ogni browser sembra comportarsi in modo diverso e i siti Web non funzionano in questo modo? – Albert

+0

Beh, forse è più saggio seguire scrupolosamente le specifiche e rendere il fornitore di ogni browser conforme alle specifiche? –

+0

Le specifiche sono piuttosto clementi qui. –

14

Ho appena cercato il relativo codice in Chrome, ed è 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

Ho pensato a quale fosse la risposta a questa domanda dopo averlo sperimentato con Chrome e richieste di nodi e inizialmente ritenendo che fosse del tutto normale. Poi ho pensato che anche se poteva essere "storico", probabilmente non era "corretto". Così ho trovato questa pagina, e sembra che essere "corretto" sia meno importante di essere compatibile con le implementazioni "storiche" ... il che suonava deludente per un minuto. Poi ho ricordato che ogni "tradizionale", non-Ajax/API, basato sulla forma "POST" che abbia mai visto risponde con un reindirizzamento che presuppone un GET.

È quello che è e che probabilmente non sta cambiando mai. Grazie a tutti i precedenti risponditori per aver fornito tutte le informazioni pertinenti.

Problemi correlati