Вопрос по http-status-codes, rest, redirect, http – HTTP код состояния, чтобы повторить тот же запрос

24

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

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

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

Хорошие ответы наstackoverflow.com/q/9794696/520567 (202 и 423) akostadinov
Добавьте изменяемый параметр URL, чтобы он выигралне похоже на петлю. Barmar

Ваш Ответ

2   ответа
30

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

Тем не менее, это не заставит браузер снова выполнить запрос - это то, что вам нужно сделать самостоятельно в javascript. Например, вот как вы можете выполнить повторный запрос POST 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 для автоматического повторения запроса, я неЯ думаю, это хорошая идея. Даже если вы добавите параметр повтора, чтобы обойти определение цикла браузера (что выглядит как ужасный хак), это 'S все еще не будет работать по запросу POST. ОтRFC2616:

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

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

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

Если ты'Если вы собираетесь использовать Javascript для конкретного приложения, вы можете использовать практически любой код - все, что имеет значение, - это то, что клиентский и серверный коды согласуются с тем, как это условие отличается от других случаев. Barmar
Я неЯ думаю, что ошибка сервера - это правильный ответ. Для меня что-то в диапазоне 4хх имеет больше смысла. Я читаюstackoverflow.com/q/9794696/520567 - там 423 - это хороший вариант использования. Также 202 подходит для других случаев использования. akostadinov
3

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

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

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

Вы можете перенаправить на любой URL, и он может содержать параметры, так почемуони отличаются от исходных параметров? Но ты'прав, что это победилоне работает с POST - он выиграетснова отправьте форму на новый URL. Barmar
Я неНе думаю, что перенаправление HTTP позволяет изменять параметры? Обратите внимание, что 307 должен работать для любого метода. Так что, если исходный запрос был POST сform-data/multipartЯ неЯ не могу просто добавитьretry параметр? Jeroen
Выне следует используйте HTTP 307: "Если код состояния 307 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых был выполнен запрос ».  Источник:10.3.8 307 Временное перенаправление borlafu
@borlafu Как я уже говорил в своем предыдущем комментарии, это победилот работать с.POST Barmar

Похожие вопросы