[Delphi]实现使用TIdHttp控件向https地址Post请求

开篇:公司之前一直使用http协议进行交互(比如登录等功能),但是经常被爆安全性不高,所以准备改用https协议。百度了一下资料,其实使用IdHttp控件实现https交互的帖子并不少,鉴于这次成功实现了功能,在此总结分享给大家。

开发环境:XE2 + Indy10

https服务协议:使用Json格式交互参数

Delphi控件:TIdhttp,IdSSLIOHandlerSocketOpenSSL(原生控件)

关键DLL:libeay32.dll,ssleay32.dll


为了封装我自己的功能,控件是我自己创建自己释放的,下面列出主要代码。

首先,设置Idhttp控件的参数:

  FIdHttp := TIdHTTP.Create(nil);
  IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  FIdHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL;
  FIdHttp.HandleRedirects := True;
  FIdHttp.Request.ContentType := 'application/json';//设置交互方式为json格式
在这里IdSSLIOHandlerSocketOpenSSL.SSLOption.Method为默认值 sslvTLSv1(这个跟需要交互的HTTPS服务有关)。


其次就到交互了:

FHttpsURL是需要交互的HTTPS地址,aEnctryPost是需要提交的具体内容,使用流方式提交。

aEnctryPost内容举例:

 {"username":"test","password":"1"} 

  postStream := TStringStream.Create(aEnctryPost);
  try
    postStream.Position := 0;
    AEnctryRespose := FIdHttp.Post(FHttpsURL, postStream);
    ShowMessage(AEnctryRespose);//post后的返回内容
  finally
    FIdHttp.Disconnect;
    FreeAndNil(postStream);
  end;


常见错误信息: 

Could not load SSL library:检查libeay32.dll,ssleay32.dll两个DLL的位置(一般放在exe同目录)、版本是否正确。

HTTP 1.1 / 415: 检查IdHttp.Request.ContentType := 'application/json' 这里设置的格式是否是要求的格式,有可能是XML格式。



你可能感兴趣的:(Delphi)