2016-09-20 23 views
0

私はIndyを使用してURLアドレスからJSONを取得しています。私のコードはTIdSSLIOHandlerSocketOpenSSLIOHandlerとしてTIdHTTPとして使用しています。 URLはhttps://www.example.comhttp://www.example.com簡単ではありませんSSLがない場合のIOHandlersの相違

var IdHTTP: TIdHTTP; 
    IdSSL: TIdSSLIOHandlerSocketOpenSSL; // IO handler #1 
    IdnoSSL: TIdIOHandlerStack;   // IO handler #2 
    JSON: String; 

ハンドラとしてSSLを使用するためにいくつかの理由がある場合、私は、興味、?

begin 
    IdHTTP := TIdHTTP.Create; 

    try 
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); 
    IdHTTP.IOHandler := IdSSL; 

    // IdnoSSL:= TIdIOHandlerStack.Create(IdHTTP); 
    // IdHTTP.IOHandler := IdnoSSL; 

    JSON := IdHTTP.Get('http://www.example.com'); 
    finally 
    IdHTTP.Free; 
    end; 
end; 

または私はTIdSSLIOHandlerSocketOpenSSLを削除し、TIdIOHandlerStackでnoSSLを使うべきなのでしょうか?

ヘルプやアドバイスが必要です。

答えて

6

IdSSLを割り当てた場合、TIdHTTPは、HTTPまたはHTTPS URLが要求されているかどうかによって自動的に有効/無効になります。だから、あなたはIdSSLを常に割り当て、TIdHTTPはそれを使う方法を決めることができます。

一方、HTTPSをまったく必要としない場合は、実際にはIOHandlerを割り当てなくてもかまいません(ほぼIdnoSSLはほとんどありません)。サーバーに接続するとき、IOHandlerがまだ割り当てられていない場合、IndyはデフォルトのTIdIOHandlerStackを作成します。

Indyの最新バージョンを使用していて、SSL/TLS設定をカスタマイズする必要がない場合は、you don't need to manually assign an IOHandler for HTTPS

ただし、SSL IOHandlerが割り当てられていないHTTPS URL(手動またはその他)をリクエストしようとすると、EIdIOHandlerPropInvalid例外が発生します。

+0

ありがとうございます。 HTTPにアクセスするための 'IOHandler'を割り当てようとせず、' EIdIOHandlerPropInvalid'例外も取得しました。だから私はそこに 'IdSSL'を残しました。 – Legionar

+0

Hmm ..私は別のコンピュータで試してみましたが、Delphiがインストールされておらず、例外は 'EIdOSSLCouldNotLoadSSLLibrary'でした。だから私はいくつかのSSLライブラリを私のアプリに含める必要がありますか?手伝ってくれてありがとう。 – Legionar

+0

@Legionar ** only ** way 'EIdIOHandlerPropInvalid'は、' SSLIOHandler'が割り当てられていないHTTPS urlが要求された場合に発生します。 HTTP URLがHTTPS URLへのリダイレクトを送り返している必要があります。そして、もしあなたが 'TIdSSLIOHandlerSocketOpenSSL'を使っているなら、あなたのアプリケーションに[OpenSSL library](http://indy.fulgan.com/SSL/)を配備する必要があります。 –

関連する問題