21 Stimmen

HTTP: POST-Anfrage erhält ein 302, sollte die Umleitungsanfrage ein GET sein?

Ich habe gelesen este aber ich habe dort nicht wirklich herausgefunden, welchen Request-Typ der Redirect-Request in welchem Fall haben sollte, d.h. die Funktion (initialer Request-Typ, Response-Typ) -> Redirect-Request-Typ.

In meinem speziellen Fall war das der Fall:

  • ursprüngliche Anforderungsart: POST
  • Antworttyp: 302

Google Chrome verwendet einen GET für die umgeleitete Anfrage.

In der Python-Bibliothek Anfragen gibt es den folgenden Code ( aquí ):

# 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

D.h. der redirect-request-type ist GET im Falle von 303 ( codes.see_other ), in allen anderen Fällen ist es der ursprüngliche Anfragetyp. D.h. in meinem obigen Fall wäre es POST, im Gegensatz zu Chrome.

Das ist wahrscheinlich falsch, denn ich habe eine Website, bei der dies nicht richtig zu funktionieren scheint (d. h. die Website verhält sich nicht gut auf diese Weise).

Was wäre die richtige Vorgehensweise/Funktion?

24voto

Albert Punkte 61113

Ich habe gerade nach dem entsprechenden Code in Chrome gesucht, und aquí es ist:

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;
}

7voto

Julian Reschke Punkte 37371

Laut RFC 2616 lautet die Antwort "die ursprüngliche Methode". HTTPbis wird dies überarbeiten, da es (leider) nicht das widerspiegelt, was die Browser tun.

Siehe http://trac.tools.ietf.org/wg/httpbis/trac/ticket/160 für die Geschichte.

1voto

Simon Richter Punkte 27154

Außer bei 303 und 307 sind beide Verhaltensweisen gemäß den spec vor allem aus historischen Gründen.

0voto

cwnewhouse Punkte 179

Ich habe über die Antwort auf diese Frage nachgedacht, nachdem ich diese Erfahrung mit Chrome und Node-Requests gemacht hatte und zunächst davon ausging, dass dies völlig normal sei. Dann dachte ich, dass es zwar "historisch" sein mag, aber wahrscheinlich nicht "korrekt" ist. Also habe ich diese Seite gefunden, und es klingt so, als sei "korrekt" weniger wichtig als die Kompatibilität mit "historischen" Implementierungen... was für einen Moment enttäuschend klang. Dann erinnerte ich mich daran, dass jedes "traditionelle", nicht-Ajax/API, formularbasierte "POST", das ich je gesehen habe, mit einem Redirect antwortet, der ein GET voraussetzt.

Es ist, wie es ist, und daran wird sich wohl auch nichts ändern. Vielen Dank an alle, die bereits geantwortet haben, für die Bereitstellung aller relevanten Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X