Delphi - Использование Indy HTTP Client для отправки ответа обратно на сервер - PullRequest
4 голосов
/ 30 января 2011

Я использую объект Indy idHTTP для запроса данных XML с сервера. Как только запрос сделан, сервер отправляет ответ, и я могу прочитать заголовок ответа ОК: результат: = IdHTTP1.Response.ResponseText;

Затем их система продолжает отправлять незапрошенные данные XML с регулярными интервалами, пока не истечет заданный период ожидания.

Однако клиент теперь хочет, чтобы мое клиентское приложение отправляло ему ответ HTTP каждый раз, когда я получаю данные (ответ, основанный на успешном анализе XML).

Я могу понять, как отправить ответ, если я был сервером, но как я могу сгенерировать заголовок ответа и использовать мой клиент idHTTP1 для публикации (или размещения, отправки и т. Д.) Только заголовка.

Это, я думаю, не совсем определено в RFC 2616, поскольку сервер обычно отправляет ответ HTTP, а не клиент, а именно:

6 Ответ

"После получения и интерпретации сообщения-запроса сервер отвечает с ответным сообщением HTTP. "

Я думал, что смогу использовать TIdHTTPResponseInfo и использовать метод WriteHeader, но не смог понять, как настроить связь с URL-адресом, на который мне нужно ответить, если я являюсь клиентом.

Я использую Delphi XE и Indy 10.5.7

Я пробовал несколько способов, но ни один из них не помог.

Любая помощь или возможные примеры кода действительно приветствуются!

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Ваш вопрос можно разделить на две части: (а) какие данные я должен отправить на сервер, чтобы уведомить сервер, и (б) как мне отправить эти данные с использованием IdHTTP.

При отправке потока данных до закрытия соединения соответствует стандарту HTTP, HTTP является протоколом запрос-ответ. Если клиент получает данные в качестве ответа, он не может ответить своим собственным ответом - клиент может только отправить другой запрос. Итак, ваша задача - выяснить, какой запрос сервер примет в качестве подтверждения получения данных. Как только вы поймете это, вы сможете найти, как (если) это возможно с IdHTTP.

Обновление: если вы должны отправить 200 OK на сервер , то это не соответствует спецификации протокола HTTP. Вы можете попробовать добраться до сокета за HTTP-клиентом и просто отправить 7 байтов (200 OK + CRLF).

2 голосов
/ 01 февраля 2011

Если сервер ожидает, что клиент отправит подтверждение каждого ответа XML, то сервер НЕ реализует фактический протокол HTTP, поскольку это недопустимое поведение. Скорее всего, они реализуют собственный протокол, имитирующий, но не HTTP. Например, SIP имеет много характеристик, которые похожи на HTTP, а многие - нет (например, несколько ответов на один запрос).

Вам необходимо выяснить, какой протокол на самом деле реализует сервер. Вы не сможете использовать TIdHTTP для этого. Вместо этого используйте TIdTCPClient напрямую. Затем вы можете отправлять и получать данные так, как вам нужно.

...