HTTP-сообщение без ожидания ответа - PullRequest
0 голосов
/ 30 августа 2018

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

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

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

1 Ответ

0 голосов
/ 30 августа 2018

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

...