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/

赞赏

微信赞赏支付宝赞赏

wordpress-hide-category
python-save-webpage2word
专业版windows系统bitlocker突然无法打开