HTTP: POST-запрос получает 302, должен ли редирект-запрос быть GET? - PullRequest
16 голосов
/ 15 ноября 2011

Я читал это , но я действительно не понял, какой тип запроса должен иметь запрос на перенаправление, в каком случае, то есть функция (начальный тип запроса, тип ответа) - > redirect-request-type.

В моем конкретном случае у меня было:

  • начальный тип запроса: POST
  • тип ответа: 302

Google Chrome использовал GET для перенаправленного запроса.

В библиотеке Python запросов есть следующий код ( здесь ):

# 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

То есть, тип перенаправления-запроса равен GET в случае 303 (codes.see_other), во всех остальных случаях это исходный тип запроса. То есть, для моего конкретного случая выше, это будет POST, в отличие от Chrome.

Это, вероятно, неправильно, потому что у меня есть один веб-сайт, который на самом деле не работает должным образом (то есть веб-сайт не ведет себя так хорошо).

Каков будет правильный путь / функция?

Ответы [ 4 ]

18 голосов
/ 15 ноября 2011

Я только что искал соответствующий код в Chrome, а здесь это:

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;
}
7 голосов
/ 15 ноября 2011

Согласно RFC 2616, ответом является «оригинальный метод». HTTPbis пересмотрит это, так как не отражает действия браузеров (к сожалению).

См. http://trac.tools.ietf.org/wg/httpbis/trac/ticket/160 для истории.

1 голос
/ 15 ноября 2011

За исключением 303 и 307, любое поведение является приемлемым согласно спецификации , главным образом по историческим причинам.

0 голосов
/ 18 августа 2017

Я подумал о том, что ответит на этот вопрос после того, как столкнулся с Chrome и запросами узлов, и изначально предположил, что это было совершенно нормально. Тогда я подумал, что, хотя это может быть «историческим», оно, вероятно, не было «правильным». Так что я нашел эту страницу, и звучит так, будто быть «правильным» менее важно, чем быть совместимым с «историческими» реализациями ... что на минуту показалось разочаровывающим. Затем я вспомнил, что каждый «традиционный», не Ajax / API, «POST» на основе форм, который я когда-либо видел, отвечает перенаправлением, которое предполагает GET.

Это то, что есть, и это, вероятно, никогда не изменится. Спасибо всем предыдущим респондентам за предоставление всей необходимой информации.

...