Используя Инди TIdHTTP
компонент, я хочу сделать POST
операция без ожидания ответа от сервера. Нормальная функция, которую я использую:
IdHTTP1->Post(sURL, reqStream, resStream);
Но я хочу пропустить ответ, чтобы сэкономить время, так Post()
выходит быстрее. Как я могу это сделать?
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
Других решений пока нет …