Delphi - indy10訪問https網站的方法!!!


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM