Delphi:10.3
Indy :10.6.2
盡情享受拿着好代碼直接用的幸福吧!!!先直接上代碼吧?下面代碼已經經過充分測試,加入足夠多的注釋,包括各處關鍵代碼如果不存在會發生什么類型的錯誤的注釋!!!
//需要引入的單元
uses IdBaseComponent, IdComponent, IdServerIOHandler, IdSSL, IdSSLOpenSSL, IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdZLibCompressorBase, IdCompressorZLib;
{ IndyHttp Get方式訪問網站 參數: url:要訪問的網站網址 responseText:訪問的返回值 proxyServer:代理服務器Ip proxyPort:代理服務器端口 返回值: 訪問是否成功的布爾值 } function IndyGet(url: string; var responseText: string; proxyServer: string = ''; proxyPort: integer = 0): Boolean; var IdHTTPTemp: TIdHTTP; // http客戶端對象 IdSSLIOHandlerSocketOpenSSLTemp: TIdSSLIOHandlerSocketOpenSSL; // ssl對象 IdCompressorZLibTemp: TIdCompressorZLib; // 數據壓縮對象 isSuccess: Boolean; // 是否訪問成功的布爾值 begin isSuccess := False; // 設置是否訪問成功的布爾值默認值為false try try { 1, 創建TIdHTTP對象 } IdHTTPTemp := TIdHTTP.Create(nil); IdHTTPTemp.HandleRedirects := true; // 設置重定向屬性,防止不能轉發Url IdHTTPTemp.Request.BasicAuthentication := true; // 必須設置此項為true才能一次通過驗證 { 這里設置很重要,如果不這樣設置,會出錯: HTTP/1.1 403 Bad Behavior } IdHTTPTemp.Request.Accept := 'text/html, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'; IdHTTPTemp.Request.AcceptEncoding := 'gzip, deflate'; IdHTTPTemp.Request.UserAgent := 'Mozilla/4.0'; // 設置代理服務器 if trim(proxyServer) <> '' then begin IdHTTPTemp.ProxyParams.proxyServer := trim(proxyServer); // 代理服務器IP IdHTTPTemp.ProxyParams.proxyPort := proxyPort; // 代理服務器端口 end; { 2,創建SSL組件 } IdSSLIOHandlerSocketOpenSSLTemp := TIdSSLIOHandlerSocketOpenSSL.Create(nil); { 設置SSL組件使用的OpenSSL版本號,如果設置不正確,會出錯: Error connectiong with ssl. error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocal version } IdSSLIOHandlerSocketOpenSSLTemp.SSLOptions.Method := sslvTLSv1_2; // 設置indy的http控件使用的ssl依賴組件,必須設置,否則無法訪問ssl網站 IdHTTPTemp.IOHandler := IdSSLIOHandlerSocketOpenSSLTemp; { 3,創建傳輸數據用的壓縮組件 } IdCompressorZLibTemp := TIdCompressorZLib.Create(nil); // 設置indy的http控件使用的數據壓縮組件,如果不設置,那么得到的是壓縮的數據,不報任何錯誤 IdHTTPTemp.Compressor := IdCompressorZLibTemp; { 備用屬性,暫時未用 } // // 設置身份驗證帳號 // IdHTTP1.Request.Username := Trim(account); // // 設置身份驗證密碼 // IdHTTP1.Request.password := Trim(password); // 得到web回應 responseText := IdHTTPTemp.Get(url); // 如果web相應正常,則設置判斷請求是否成功的布爾值為true if IdHTTPTemp.ResponseCode = 200 then begin isSuccess := true; // 設置判斷請求是否成功的布爾值為true end; // 關閉IdHTTP1連接 IdHTTPTemp.Disconnect; except on e: Exception do begin // 調試使用 // showMessage(e.ToString); //這里可以忽略錯誤,防止IdHTTP1無法訪問的錯誤提示 isSuccess := False; end; end; finally // 釋放創建過的各個對象 IdCompressorZLibTemp.Free; IdSSLIOHandlerSocketOpenSSLTemp.Free; IdHTTPTemp.Free; end; Result := isSuccess; end;
不能再詳細了,如果是Delphi開發人員,我想已經可以直接使用了!!!
參考:
http://ww2.indyproject.org/Sockets/Download/svn.EN.aspx
https://github.com/IndySockets/OpenSSL-Binaries
https://en.delphipraxis.net/topic/2814-tidhttp-ssl-and-error-http11-403-forbidden/
