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;