2011-01-30 14 views
4

IndyのidHTTPオブジェクトを使用して、サーバーからXMLデータを要求しています。要求が行われると、サーバーは応答を送信し、応答ヘッダーを読み取ることができます。OK: result:= IdHTTP1.Response.ResponseText;Delphi - Indy HTTP Clientを使用してサーバーに応答を返す

これらのシステムは、所定のタイムアウト期間が経過するまで、定期的な間隔で迷惑なXMLデータを送信し続けます。

しかし、顧客は、クライアントアプリケーションがデータを受信するたびにHTTP応答を返すことを望んでいます(XMLの解析に成功した場合の応答)。

私がサーバの場合は、どのように応答を送信するのがうまくいくのですか?しかし、レスポンスヘッダを生成し、idHTTP1クライアントを使用してヘッダだけを投稿(または送信など)することはできますか?

これは、サーバーが正常にHTTP応答を送信したとおりに、クライアント、すなわち、RFC 2616で定義されていないではない、私は考えている:

6レスポンス

は「要求を受信し、解釈した後、サーバーは、 にHTTP応答メッセージで応答します。

私はTIdHTTPResponseInfoを使用してWriteHeaderメソッドを使用することができると思ったが、私は、私はクライアントだ場合に返信する必要があるURLへのリンクを設定する方法を考え出すことができませんでした。

は、私は、Delphi XEおよびインディ10.5.7私はいくつかの方法を試してみた

が、成功したそれらのどれを使用しています。

本当にありがとうございました!

+0

'TIdHttp'はCLIENT HTTPコンポーネントです。これはWebブラウザと同等です。誰かがあなたに '一定のタイムアウト期間が満了するまで、一定の間隔であなたの'非請求XMLデータをどう送るのですか? 「このGoogle検索を実行した後、私は、所定の時間が満了するまで私のブラウザで新しいウェブページを取得し続ける」と言っているようです。 –

+0

@ CosminはRFC 2616を再読み込みします。これも可能です。 –

+0

はい、正確です。彼らのシステムがWebページではないXMLデータを送信することを除いて。実際にはそれで見える間違いはありません。迷惑データ受信部は正常に動作します。それはまったく問題ではありません。ソートする必要があるHTTP応答を返す方法です。 – James

答えて

4

質問は、(a)サーバーに通知するためにサーバーに送信するデータと、(b)IdH​​TTPを使用してこのデータを送信する方法の2つに分けることができます。

接続が閉じられるまでデータストリームを送信するのはHTTP標準に対応していますが、HTTPは要求応答プロトコルです。クライアントがデータを応答として受け取った場合、クライアントは自分自身の応答で応答することはできません。クライアントは別の要求のみを送信できます。だからあなたの仕事は、サーバがデータ受信の確認としてどのような要求を受け入れるかを理解することです。一度これを理解すると、IdHTTPでどのように(もし)可能かを見つけることができます。

更新:サーバーにを送信する場合、は、HTTPプロトコル仕様に準拠していません。 HTTPクライアントの背後にあるソケットにアクセスし、7バイト(200 OK + CRLF)だけを送信することができます。

+0

ありがとう、パート(a)のために戻ってくるものを解決することができます。例えば200 OKまたは400エラー。答えを知る必要があるのはあなたの(b)です。あなたはおそらくさらなるリクエストをすることを提案していますが、何らかの形でHTTPヘッダーだけが含まれているので、実際に応答を受け取ったサーバーを「騙す」ようにしていますか? – James

+0

@James答えを更新しました。 –

+0

ありがとうEugeneさん、「HTTP/1.1 200 OK CrLf」(18バイト)にする必要はありませんか、HTTPバージョン情報は必要ありませんか? (RFC 2616,6.1: '6.1 Status-Line )レスポンスメッセージの最初の行は、プロトコルバージョンの とそれに続く数字のステータスコードとそれに対応するテキストフレーズで構成され、各要素が区切られたStatus-LineですSP 文字で、最後のCRLFシーケンス以外のCRまたはLFは使用できません。 ステータスライン= HTTPバージョンSPステータスコードSP理由コードフレーズCRLF ' – James

1

クライアントが各XML応答の肯定応答を送信することをサーバーが期待する場合、サーバーは実際のHTTPプロトコルを実装していません。これは動作が許可されていないためです。おそらく、HTTPを模倣する独自のカスタムプロトコルを実装していますが、そうではありません。たとえば、SIPには、HTTPに似た多くの特徴があります(たとえば、単一の要求に対する複数の応答)。

実際に実装されているプロトコルの種類を調べる必要があります。あなたはそれにTIdHTTPを使用することはできません。直接代わりにTIdTCPClientを使用してください。その後、必要なデータを送受信できます。