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/
赞赏
微信赞赏
支付宝赞赏
发表评论