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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{
  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;

  

posted @   delphi中间件  阅读(7087)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示