本篇目录
在测试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;varIdHttp : 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;tryUrl := '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);excepton e : Exception dobeginShowMessage(e.Message);end;end;//获取网页返回的信息ResponseStr := ResponseStream.DataString;//网页中的存在中文时,需要进行UTF8解码ResponseStr := UTF8Decode(ResponseStr);// ResponseStr := UTF8ToString(ResponseStr);finallyShowMessage(ResponseStr);IdHttp.Free;RequestList.Free;RequestStream.Free;ResponseStream.Free;end;end;
2、绑定一个按钮事件来触发
procedure TForm1.Button1Click(Sender: TObject);beginhttpsPost();end;

发表评论