2012-07-19 14 views
8

我試圖使用TIdHTTP.Get到USPS ZIP4結果網頁源加載到一個變量(以提取4位郵政編碼後綴),例如,TIdHTTP.Get EIdIOHandlerPropInvalid錯誤

PgSrc := IdHTTP1.Get('https://tools.usps.com/go/ZipLookupResultsAction!input.action?resultMode=0&companyName=&address1=1600+PENNSYLVANIA+AVE+NW&address2=&city=&state=Select&urbanCode=&postalCode=&zip=20500'); 

上面如果我將它粘貼到任何瀏覽器中,示例url工作正常。但是,在我的代碼中,我得到一個EIdIOHandlerPropInvalid錯誤,並顯示以下消息「IOHandler值無效」。

我有很多郵政編碼來查找,所以我將不勝感激任何幫助,以避免此錯誤或建議採取不同的方法。

+0

獲取與其他網址的工作嗎?也許組件未正確初始化。你配置了SSL嗎?請參閱http://stackoverflow.com/questions/6683127/delphi-idhttpssl – mjn 2012-07-19 11:57:01

+0

@mjn我沒有爲SSL配置它 – 2012-07-19 17:36:26

回答

20

要避免此異常,您必須分配IOHandler屬性。

檢查此示例。

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    IdHTTP, 
    IdSSLOpenSSL, 
    SysUtils; 

Var 
    IdHTTP1 : TIdHTTP; 
    Src : string; 
    LHandler: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    try 
    IdHTTP1:=TIdHTTP.Create(nil); 
    try 
    LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    try 
     IdHTTP1.IOHandler:=LHandler; 
     Src:= IdHTTP1.Get('https://tools.usps.com/go/ZipLookupResultsAction!input.action?resultMode=0&companyName=&address1=1600+PENNSYLVANIA+AVE+NW&address2=&city=&state=Select&urbanCode=&postalCode=&zip=20500'); 
     Writeln(Src); 
    finally 
     LHandler.Free; 
    end; 
    finally 
    IdHTTP1.Free; 
    end; 
    except on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

注意:還記得複製SSL DLL(libeay32.dll,ssleay32.dll)到您的系統。

+0

它工作得很好! – 2012-07-19 17:37:28

+0

請注意,如果您使用的是最新版本的Indy,那麼如果第一個請求用於HTTPS URL,則「TIdHTTP」現在可以爲您創建一個默認SSLIOHandler。有關詳細信息,請參閱[用於TIdHTTP的新HTTPS功能](http://www.indyproject.org/sockets/blogs/changelog/20141222.aspx)。 – 2017-04-03 16:15:13

+0

只是澄清,我會補充說,這個問題與沒有正確配置SSL相關,否則,答案很好...... – 2017-06-29 10:08:38