Delphi - indy10访问https网站的方法!!!
<p>Delphi:10.3</p><p>Indy :10.6.2</p>
<p>尽情享受拿着好代码直接用的幸福吧!!!先直接上代码吧?下面代码已经经过充分测试,加入足够多的注释,包括各处关键代码如果不存在会发生什么类型的错误的注释!!!</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">//需要引入的单元<br>uses</span><span style="color: rgba(0, 0, 0, 1)">
IdBaseComponent, IdComponent, IdServerIOHandler, IdSSL, IdSSLOpenSSL,
IdTCPConnection, IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket,
IdIOHandlerStack, IdZLibCompressorBase, IdCompressorZLib;</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">
IndyHttp Get方式访问网站
参数:
url:要访问的网站网址
responseText:访问的返回值
proxyServer:代理服务器Ip
proxyPort:代理服务器端口
返回值:
访问是否成功的布尔值
</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> IndyGet(url: <span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 0, 255, 1)">var</span> responseText: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
proxyServer: </span><span style="color: rgba(0, 0, 255, 1)">string</span> = <span style="color: rgba(128, 0, 0, 1)">''</span>; proxyPort: integer = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
IdHTTPTemp: TIdHTTP; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> http客户端对象</span>
IdSSLIOHandlerSocketOpenSSLTemp: TIdSSLIOHandlerSocketOpenSSL; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ssl对象</span>
IdCompressorZLibTemp: TIdCompressorZLib; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据压缩对象</span>
isSuccess: Boolean; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 是否访问成功的布尔值</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
isSuccess :</span>= False; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置是否访问成功的布尔值默认值为false</span>
<span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 1, 创建TIdHTTP对象 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
IdHTTPTemp :</span>= TIdHTTP.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
IdHTTPTemp.HandleRedirects :</span>= true; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置重定向属性,防止不能转发Url</span>
IdHTTPTemp.Request.BasicAuthentication := true; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 必须设置此项为true才能一次通过验证</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">
这里设置很重要,如果不这样设置,会出错:
HTTP/1.1 403 Bad Behavior
</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
IdHTTPTemp.Request.Accept :</span>=
<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">text/html, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
IdHTTPTemp.Request.AcceptEncoding :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gzip, deflate</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
IdHTTPTemp.Request.UserAgent :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Mozilla/4.0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置代理服务器</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> trim(proxyServer) <> <span style="color: rgba(128, 0, 0, 1)">''</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
IdHTTPTemp.ProxyParams.proxyServer :</span>= trim(proxyServer); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 代理服务器IP</span>
IdHTTPTemp.ProxyParams.proxyPort := proxyPort; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 代理服务器端口</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 2,创建SSL组件 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
IdSSLIOHandlerSocketOpenSSLTemp :</span>=<span style="color: rgba(0, 0, 0, 1)">
TIdSSLIOHandlerSocketOpenSSL.</span><span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">
设置SSL组件使用的OpenSSL版本号,如果设置不正确,会出错:
Error connectiong with ssl.
error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocal version
</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
IdSSLIOHandlerSocketOpenSSLTemp.SSLOptions.Method :</span>= sslvTLSv1_<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置indy的http控件使用的ssl依赖组件,必须设置,否则无法访问ssl网站</span>
IdHTTPTemp.IOHandler :=<span style="color: rgba(0, 0, 0, 1)"> IdSSLIOHandlerSocketOpenSSLTemp;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 3,创建传输数据用的压缩组件 </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
IdCompressorZLibTemp :</span>= TIdCompressorZLib.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置indy的http控件使用的数据压缩组件,如果不设置,那么得到的是压缩的数据,不报任何错误</span>
IdHTTPTemp.Compressor :=<span style="color: rgba(0, 0, 0, 1)"> IdCompressorZLibTemp;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> 备用属性,暂时未用 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> // 设置身份验证帐号</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> IdHTTP1.Request.Username := Trim(account);</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> // 设置身份验证密码</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> IdHTTP1.Request.password := Trim(password);</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 得到web回应</span>
responseText :=<span style="color: rgba(0, 0, 0, 1)"> IdHTTPTemp.Get(url);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果web相应正常,则设置判断请求是否成功的布尔值为true</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> IdHTTPTemp.ResponseCode = <span style="color: rgba(128, 0, 128, 1)">200</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
isSuccess :</span>= true; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置判断请求是否成功的布尔值为true</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭IdHTTP1连接</span>
<span style="color: rgba(0, 0, 0, 1)"> IdHTTPTemp.Disconnect;
</span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)">
on e: Exception </span><span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调试使用</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> showMessage(e.ToString); //这里可以忽略错误,防止IdHTTP1无法访问的错误提示</span>
<span style="color: rgba(0, 0, 0, 1)">
isSuccess :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 释放创建过的各个对象</span>
<span style="color: rgba(0, 0, 0, 1)"> IdCompressorZLibTemp.Free;
IdSSLIOHandlerSocketOpenSSLTemp.Free;
IdHTTPTemp.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> isSuccess;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>不能再详细了,如果是Delphi开发人员,我想已经可以直接使用了!!!</p>
<p>参考:</p>
<p>http://ww2.indyproject.org/Sockets/Download/svn.EN.aspx</p>
<p>https://github.com/IndySockets/OpenSSL-Binaries</p>
<p>https://en.delphipraxis.net/topic/2814-tidhttp-ssl-and-error-http11-403-forbidden/</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/sunylat/p/13593960.html
頁:
[1]