2013-10-17 7 views
5

L'ho scoperto dopo alcuni test su una nuova API e l'amministratore da quel lato ha detto che sto facendo GET mentre sto facendo i POST dalla mia parte. Dopo aver abilitato il debug, ho trovato che le richieste eseguiranno il POST iniziale e quindi eseguiranno un GET sul nuovo URL 302.python-request modifica un POST a un GET quando riceve un HTTP 302. Questo comportamento è previsto?

Il problema è stato risolto subito dopo aver capito qual era il problema, ma si tratta di un bug o di un comportamento previsto? Se ricevi un 302 su un POST, non dovresti sollevare un'eccezione o ritentare il POST sul nuovo URL.

Non voglio collegarlo a GitHub come un bug, a meno che non sia sicuro che sia uno. Voglio solo un input su questo.

Grazie

+1

cosa dire di [allow_redirects = False] (http://www.python-requests.org/en/latest/user/quickstart/#redirection-and-history) –

risposta

5

Secondo la RFC,

Se il codice 302 di stato ricevuto in risposta ad una richiesta diversa da GET o HEAD, l'agente utente NON DEVE reindirizzare automaticamente la richiesta a meno può essere confermato dall'utente, poiché questo potrebbe cambiare le condizioni in cui è stata emessa la richiesta.

(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3)

Quindi questo comportamento è per lo meno non compatibile - MA il RFC afferma anche che:

Nota: RFC 1945 ed RFC 2068 specificare che il client non è consentito per cambiare il metodo sulla richiesta reindirizzata. Tuttavia, la maggior esistenti implementazioni agente utente trattano 302 come se fosse una risposta 303 , eseguendo una GET sulla Posizione campo valore indipendentemente del metodo di richiesta originale. I codici di stato 303 e 307 hanno aggiunto per i server che desiderano chiarire in modo inequivocabile quale tipo di reazione è previsto per il client da .

IOW: pur non essendo compatibili con RFC, questo è il comportamento di default per la maggior parte degli user-agent, e la maggior parte delle applicazioni web facciano realmente implementare post-redirect-get con un 302 al posto di un 303.

Così requests il comportamento qui non è ovviamente un bug, ma una decisione progettuale pratica. E come Foo Bar User già mentito, puoi modificarlo usando l'arg. allow_redirects.

+0

Grazie per la risposta dettagliata. Sto già utilizzando l'URL corretto, quindi non c'è alcun problema per me. Mi stavo solo chiedendo di questo strano comportamento. – Dax

+0

@Dax haha, dice wikipedia 'Questo è un esempio di pratica industriale contraddittoria con lo standard.' –

0

Secondo Wikipedia, le richieste sono state corrette. Se un server web vuole un redirect e utilizzare lo stesso metodo, si dovrebbe inviare 307 Temporary Redirect (since HTTP/1.1).

302 Trovato

Questo è un esempio di pratica industriale contraddizione standard . Il HTTP/1.0 specifica (RFC 1945) richiesto al cliente di eseguire un redirect temporaneo (la frase che descrive originale è stato "sposta il prestatore"), [6] ma i browser più diffusi implementate 302 con la funzionalità di un 303 See Altro. Pertanto, HTTP/1.1 ha aggiunto lo stato codici 303 e 307 per distinguere tra i due comportamenti.Tuttavia, alcune applicazioni Web e framework utilizzano il codice 302 di stato come se fosse il 303.

2

che imita il comportamento dei browser, che sarà sempre fare un GET su un reindirizzamento, non un POST.

Wikipedia ha una spiegazione di questo comportamento: sotto lo standard originale, i browser dovevano reindirizzare con un POST, ma tutti lo implementavano con un GET. Sono stati introdotti i codici di stato 303 e 307 per chiarire questo, con 303 come comportamento corrente (GET) e 307 come quello originariamente previsto (POST), ma questi sono usati raramente nella pratica.

Problemi correlati