环境: delphi XE5 , Https
客户提供了基于https的接口,并符带相关例子供测试调用。
相关例子只有 C#,java, PHP 。 网上关于delphi https Post 的相关资料很少,经过摸索后终于成功调取。
HTTPS是在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。也就是加强版http , 需要传输证书。
提供过来的证书有: p12, jks, pem
经过测试,delphi 只能使用 pem (pem 有两个文件分别是加密证书和私钥 + 一个证书密码)
步骤
1 使用两个控件 TIdHTTP, TIdSSLIOHandlerSocketOpenSSL
IdHTTP1.HandleRedirects := True;
IdHTTP1.AllowCookies := True;
IdHTTP1.ReadTimeout := 5000;
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP1.Request.CharSet := 'UTF-8';
IdHTTP1.HTTPOptions := [hoInProcessAuth,hoKeepOrigProtocol,hoForceEncodeParams];
IdHTTP1.IOHandler := SSL;
SSL.SSLOptions.Method := sslvSSLv23;
SSL.SSLOptions.CertFile := '{加密证书文件路径}';
SSL.SSLOptions.KeyFile := '{私钥文件路径}';
证书密码需要在 TIdSSLIOHandlerSocketOpenSSL 的OnGetPassword事件里添加如下
Procedure TForm1.SSLGetPassword(var Password: string);
begin
Password := '{证书密码}';
end;
Post 使用的编码类型 application/x-www-form-urlencoded 是提供方接口规定的
这种类型,使用delphi post 参数不能用 TStringStream , 必须要用 TStringList
Post 如下
RequestList := TStringList.Create;
Try
RequestList.add('{Key}={Value}');
RequestList.add('{Key}={Value}');
RequestList.add('{Key}={Value}');
eResultHtml := IdHTTP1.Post(URL, RequestList);
finally
IdHTTP1.Disconnect;
RequestList.Free;
end;