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

Каждый успешный HTTP-запрос всегда возвращает код состояния 200?

В Delphi я использую Indy TIdHTTPWebBrokerBridge в сочетании с TIdHTTP для отправки/получения данных через HTTP. На сервере у меня нет никакой привлекательной обработки, я всегда отвечаю простым потоком контента. Если есть какие-либо проблемы, я возвращаю информацию об этой проблеме только в ответном контенте (например, при неудачной аутентификации, неверном запросе и т.д.). Итак, на стороне клиента могу ли я предположить, что каждый успешный запрос, который я делаю на этот сервер, всегда будет иметь код ответа 200 (OK)?

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

Внутри этой функции:

IdHTTP.Get(SomeURL, AStream);
Result:= IdHTTP.ResponseCode = 200;

Эта функция обрабатывает любой запрос, который может извлекать данные. Если в запросе были какие-либо проблемы, эта функция должна возвращать False. В моем сценарии, так как я всегда возвращаю какой-то контент на сервер, будет ли клиент всегда получать код ответа 200 в этой функции?

Я предполагаю, что реальный вопрос заключается в том, что если я всегда возвращаю какой-то контент и обрабатываю все исключения на сервере, тогда сервер всегда будет возвращать код состояния 200 для каждого запроса?

4b9b3361

Ответ 1

Чтобы ответить на ваш конкретный вопрос:

Можно ли предположить, что каждый успешный запрос, который я делаю на на этом сервере, всегда будет иметь код ответа 200 (OK)?

Ответ Да, потому что TIdHTTPWebBrokerBridge wraps TIdHTTPServer, который всегда устанавливает код ответа по умолчанию на 200 для каждого запроса, если вы не перезаписываете его другим значением самостоятельно или не имеете сервер делает что-то, что неявно отвечает с помощью другого кода ответа (например, Redirect(), который использует 302 или SmartServeFile(), который использует 304), или сталкивается с ошибкой, которая заставляет TIdHTTPServer назначать код ошибки ошибки 4xx или 5xx.

Однако, в общем, то, что вам сказали другие, верно. На стороне клиента вы должны обрабатывать любой возможный код ответа HTTP-ответа, а не только 200. Не делайте никаких предположений о реализации сервера.

Фактически, TIdHTTP уже обрабатывает это для вас. Если TIdHTTP встречает код ответа, который он считает кодом ошибки, он вызывает в своем коде исключение EIdHTTPProtocolException. Поэтому, если вы не получите исключения, предположите, что ответ успешный. Вам не нужно проверять код ответа вручную.

Если есть конкретный код ответа, который обычно вызывает исключение, но вы его не хотите, вы можете указать это значение в необязательном параметре AIgnoreReplies TIdHTTP.Get() или TIdHTTP.DoRequest(). Или, если вы используете обновленную версию SVN Indy 10, новый флаг hoNoProtocolErrorException был недавно добавлен в свойство TIdHTTP.HTTPOptions, поэтому исключение EIdHTTPProtocolException не создается для какого-либо кода ответа.

Ответ 2

"Каждый успешный HTTP-запрос всегда возвращает код состояния 200?"

См. w3.org: HTTP/1.1 Status Code Definitions (RFC 2616)

Ответ Нет. Все 2xx считаются успешными. Это может зависеть от

Как вы можете узнать из RCF, каждый метод ДОЛЖЕН иметь собственные коды статуса успеха, в зависимости от реализации.

Ваш другой вопрос:

"могу ли я предположить, что каждый успешный запрос, который я делаю на этот сервер, всегда будет иметь код ответа 200 (OK)?"

Вы всегда можете ожидать код состояния 200, если веб-сервер всегда отвечает статусом 200. Приложение веб-сервера контролирует, какой ответ он возвращает клиенту.

Таким образом, код состояния 200 является ответом Standard для успешных HTTP-запросов (фактический ответ будет зависеть от используемого метода запроса), а в реальном мире веб-серверов СЛЕДУЕТ устанавливать по умолчанию при успешном запросе, если не указано иное (как объяснено в ).

Ответ 4

Я сделал следующее. Обработайте все исключения за 200 и LOG. работал не один, а не 200, за исключением несанкционированных и тайм-аутов (пароль или иногда недоступный сервер). но многие/все ответы будут рассмотрены для широкого круга основных приложений.

      while (iRedo < 3) do begin
        s := Self.HTTPComponent.Get( sUrl );

        if self.HTTPComponent.ResponseCode = 200 then begin
          break;
        end;

        // IDEIA - log what happend if not 200
        logWhatHappend( s, HTTPComponent ); // then log content, headers, etc
        inc( iRedo ); sleep( 5 );
      end;