idhttp访问HTTPS
idhttp访问HTTPS
访问一个 WEB 网站,如果采用 HTTP 的话,直接使用 TIdHTTP 这个控件,最简单的用法是:
S := IdHTTP1.Get('www.qq.com');
这里返回的 S 就是对应的网页的文本内容。
如果要访问 https 的网站,则需要 SSL 库。在 Windows 底下,去 https://indy.fulgan.com/SSL/ 下载最新的 SSL 的库。下载后,解压缩,包括两个 dll 文件:ssleay32.dll 和 libeay32.dll;直接放到你的程序编译好的 EXE 相同文件夹底下就可以了。
运行期你的程序会自动加载这两个 DLL 完成 SSL 的功能。
设计期,拖一个 TIdSSLIOHandlerSocketOpenSSL 过来,然后设置 IdHTTP1 的属性:
1. IOHandler 这个属性,下拉,选择 IdSSLIOHandlerSocketOpenSSL1;
2. HandleRedirects 属性:设置为 True;默认是 False;
另外,要注意设置一下 IdSSLIOHandlerSocketOpenSSL1 的属性:SSLOptions -> Method 这个属性,设置为:sslvTLSv1_1
然后采用这行代码就搞定:S := IdHTTP1.Get('https://www.qq.com');
//需要引入的单元
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;
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/10891990.html