2016-09-20 5 views
0

URL 주소에서 JSON을 가져 오기 위해 Indy를 사용하고 있습니다. 내 코드는 TIdSSLIOHandlerSocketOpenSSLIOHandler (TIdHTTP)으로 사용하고 있습니다. URL이 https://www.example.com, http://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

흠 .. 나는 델파이가 설치되어 있지 않은 다른 컴퓨터에서 시험해 보았고 예외적으로 'EIdOSSLCouldNotLoadSSLLibrary'를 얻었다. 그래서 내 애플 리케이션에 몇 가지 SSL 라이브러리를 포함시켜야합니까? 도와 주셔서 감사합니다. – Legionar

+0

@Legionar ** 유일한 ** 방식 인'EIdIOHandlerPropInvalid'가 발생하는 것은'SSLIOHandler'가 지정되지 않고 HTTPS URL이 요청 된 경우입니다. HTTP URL이 HTTPS URL로 리디렉션을 되돌려 보내야합니다. 그리고 예, TIdSSLIOHandlerSocketOpenSSL을 사용한다면, 앱과 함께 [OpenSSL library] (http://indy.fulgan.com/SSL/)를 배포해야합니다. –