Подтвердить что ты не робот

Код состояния HTTP для повторения одного и того же запроса

Есть ли код состояния HTTP, чтобы дать указание клиенту выполнить тот же запрос еще раз?

Я столкнулся с ситуацией, когда серверу приходится "ждать", когда блокировка исчезнет при обработке запроса. Но к тому моменту, когда блокировка исчезнет, ​​запросы могут быть близки к пределу таймаута. Таким образом, вместо того, чтобы блокировать очистку, я хотел бы дать указание клиенту просто выполнить тот же запрос еще раз.

Лучшее, что я придумал, это HTTP 307 в том же месте, но я обеспокоен тем, что некоторые браузеры могут не покупать это (обнаружение переадресации).

4b9b3361

Ответ 1

Правильный ответ, когда сервер не может обработать запрос, 503 Service Unavailable. Когда условие является временным, как и в вашем случае, вы можете установить заголовок Retry-After, чтобы клиент знал, как долго он должен ждать, прежде чем повторять попытку.

Однако это не заставит браузер повторить запрос - это то, что вам нужно будет обрабатывать в javascript. Например, вот как вы можете выполнить повторный запрос POJ запроса ajax в jquery:

function postData() {
  $.ajax({
    type: 'POST',
    url:  '503.php',
    success: function() {
      /*
         Do whatever you need to do here when successful.
      */
    },
    statusCode: {
      503: function(jqXHR) {
        var retryAfter = jqXHR.getResponseHeader('Retry-After');
        retryAfter = parseInt(retryAfter, 10);
        if (!retryAfter) retryAfter = 5;
        setTimeout(postData, retryAfter * 1000);
      }
    }
  });
}

Обратите внимание, что приведенный выше код поддерживает только заголовок Retry-After, где задержка повторения задается в секундах. Если вы хотите поддерживать даты, для которых потребуется немного больше работы. В производственном коде я также рекомендовал бы счетчик, чтобы убедиться, что вы не продолжаете повторять попытку навсегда.

Что касается использования кода состояния 307 для автоматического повторения запроса, я не думаю, что это хорошая идея. Даже если вы добавите параметр повтора, чтобы обойти обнаружение петли браузера (что кажется ужасным взломом), он все равно не будет работать над запросом POST. Из RFC2616:

Если код статуса 307 принимается в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем.

В то время как некоторые браузеры, как известно, игнорируют это требование, это определенно не правильно, и вы не хотите на него рассчитывать.

И если вы не используете запрос POST, вы почти наверняка должны быть. Помните, что запрос GET не должен иметь никаких побочных эффектов, и по умолчанию ответ будет кэшироваться. Из описания вашей проблемы это звучит очень похоже на то, что ваш запрос, вероятно, будет делать что-то, что имеет побочные эффекты.

Ответ 2

Используйте перенаправление 307, но добавьте счетчик повторов:

http://path/to/server?retry=3

Это приведет к тому, что URL-адрес будет отличаться при каждой попытке, предотвращая обнаружение цикла. И сервер может проверять, чтобы повторная попытка достигла предела, и прервать с ошибкой, когда это произойдет, поэтому пользователь не ждет навсегда.