delphi2010+Indy10.5.5调用https接口
在测试delphi调用https接口时一直报错socket 0,本来打算看看怎么升级Indy结果后面突然又搞好了,简单记录下。
一、先确保有Indy控件,版本建议不要太低
这2个控件可以拖到可视化设计面板上后,查看有哪些配置项(我对delphi不熟,不会直接拖控件调用),这些配置项在后面写https调用代码的时候可以匹配着修改。
注意IdHTTP1的 IOHandler属性默认是空的,需要确保上面的那个xxxOpenSSL1控件有效时才可选择。
二、准备dll文件
libeay32.dll、ssleay32.dll 放到bin目录或已编译exe的目录下;这两个文件网上搜下吧下载最新的,我是在自己电脑上搜的,发现有就直接用了(好像是一个安卓模拟器目录下有),https://docwiki.embarcadero.com/RADStudio/Sydney/en/OpenSSL
三、上代码
1、直接写一个函数,放到调用代码前面;注意看代码里面是不是有些参数值跟控件里面一样(代码保留了测试过程中的无用的测试语句)
function httpsPost():string; var IdHttp : TIdHTTP; IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL; Url : string;//请求地址 ResponseStream : TStringStream; //返回信息 ResponseStr : string; RequestList : TStringList; //请求信息 RequestStream : TStringStream; begin //创建IDHTTP控件 IdHttp := TIdHTTP.Create(nil); //IdHttp.HTTPOptions := [hoKeepOrigProtocol,hoForceEncodeParams]; //关键参数, 关系到编码自动转换 //hoKeepOrigProtocol 解决socket0 错误 IdHttp.HTTPOptions:=IdHttp.HTTPOptions+[hoKeepOrigProtocol];//关键这行 IdHttp.HandleRedirects:= True; //IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil); //IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method:=sslvSSLv23; //sslvSSLv3 提示握手失败 sslvTLSv1 sslvSSLv2 sslvSSLv23 提示证书错误 //IdHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL1; //IdHttp.HandleRedirects := True; IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil); IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23; // IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; //IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned; // IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmClient; // IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := []; // IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0; IdHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL1; //TStringStream对象用于保存响应信息 ResponseStream := TStringStream.Create(''); RequestStream := TStringStream.Create(''); RequestList := TStringList.Create; try Url := 'https://网址/delphi-api-test/'; try // IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); // IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL; //以列表的方式提交参数 RequestList.Add('text=love999这是中文'); IdHttp.Post(Url,RequestList,ResponseStream); //以流的方式提交参数 // RequestStream.WriteString('{"text":"love999"}'); //IdHttp.Request.ContentType :='application/json'; // IdHttp.Post(Url,RequestStream,ResponseStream); except on e : Exception do begin ShowMessage(e.Message); end; end; //获取网页返回的信息 ResponseStr := ResponseStream.DataString; //网页中的存在中文时,需要进行UTF8解码 ResponseStr := UTF8Decode(ResponseStr); // ResponseStr := UTF8ToString(ResponseStr); finally ShowMessage(ResponseStr); IdHttp.Free; RequestList.Free; RequestStream.Free; ResponseStream.Free; end; end;
2、绑定一个按钮事件来触发
procedure TForm1.Button1Click(Sender: TObject); begin httpsPost(); end;
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/delphi2010-indy-https-post/
赞赏
微信赞赏支付宝赞赏
发表评论