DelphiのIndy TIdHTTPで処理が返ってこない

DelphiのIndy TIdHTTPでGETなどを行っても、処理が返ってこない時があります。

正確にはOnConnectまでは発生するがまったくそこから動かない状態。その場合、GETメソッドのURLをURLEncodeしていない可能性があります。

URLエンコード

URLエンコードせずに送信すると相手のサーバーが応答できず、結果Indyが固まります。エラーを返すサーバーもあると思いますが、Web API系のやりとりではしばらく返ってこないときが多いようです。(Yahoo APIなど)

ちなみにURLエンコードは、Delphi標準のHTTPAppとIndyのIdURIの2つの手段がありますが、私はIndyのほうをオススメします。

なぜかというと、HTTPAppのHTMLEncodeは「+」などの記号をエンコードしないからです。

HTTPApp.HTMLEncode

「aaa+あいう」 -> 「aaa+%82%a0%82%a2%82%a4」(不正となる場合がある)

IdURI.URLEncode

「aaa+あいう」 -> 「aaa%20%82%a0%82%a2%82%a4」(正しい)

HTTPApp.HTMLEncodeのほうは正常なURLではありません。

IdURIの使い方

IdURIユニットの使い方はカンタンです。

  • UsesにIdURIを追加
  • 処理中にTIdURI.URLEncode(変換元文字列)

URLEncodeはスタティック関数ですのでTIdURIのインスタンス生成は不要です。

使用例)

uses
  IdURI;(追加)
・・・
begin
query := TIdURI.URLEncode(s);
end;