HTTP-сообщение без ожидания ответа

Используя Инди TIdHTTP компонент, я хочу сделать POST операция без ожидания ответа от сервера. Нормальная функция, которую я использую:

IdHTTP1->Post(sURL, reqStream, resStream);

Но я хочу пропустить ответ, чтобы сэкономить время, так Post() выходит быстрее. Как я могу это сделать?

-2

Решение

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

При этом у вас есть два варианта для достижения того, что вы хотите:

  • позволять TIdHTTP прочитайте ответ нормально, но просто никуда его не сохраняйте. Вы можете использовать ответ TStream который отбрасывает любые байты, записанные в него (например, TIdEventStream без OnWrite обработчик событий), или если вы используете актуальную версию Indy, вы можете просто установить поток ответов на NULL,

    IdHTTP1->Post(sURL, reqStream, (TStream*)NULL);
    

    Очевидно, что это все еще имеет издержки на чтение полного ответа из сокета, по крайней мере.

  • использовать TIdHTTP::OnHeadersAvailable событие для проверки текущего Response код состояния. Когда получен окончательный код состояния (без перенаправления, без авторизации), прервите обработку ответа, выдав исключение (например, вызвав вызов Sysutils::Abort()), который будет обходить чтение тела ответа. Убедитесь, что закрыли основной сокет после TIdHTTP::Post() выход, если TIdHTTP не делает это автоматически для вас. Или вы можете закрыть сокет вместо того, чтобы выдавать собственное исключение, и позволить TIdHTTP выдает свое собственное исключение, когда не может прочитать тело ответа из сокета. Конечный эффект одинаков в любом случае.

Я добавил новый запрос функции в систему отслеживания проблем Indy для вас, чтобы лучше решить эту проблему в будущей версии Indy:

# 230 Добавить флаг hoNoReadResponseBody в свойство TIdHTTP.HTTPOptions

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]