随笔 - 809  文章 - 0 评论 - 144 阅读 - 770万

今天研究阿里巴巴的对接,发现IDHTTP 的post 如果是 https 的连接就会报:“IOHandler value is not valid.”错误

 

加载https的站点页面内容的时候记得在窗体上加上“IdSSLIOHandlerSocketOpenSSL1”

以及idhttp里面IOHandler为“IdSSLIOHandlerSocketOpenSSL1”

不然老报“IOHandler value is not valid.”错误。


dnspod API V2.0 就是用的https 用delphi开发客户 只需要用idhttp就可以post

在界面上放一个TIdHTTP控件,命名为IdHTTP1,再放一个TIdSSLIOHandlerSocket控件,命名为

IdSSLIOHandlerSocket1,将IdHTTP1的IOHandler属性设为IdSSLIOHandlerSocket1,这样就可以随

意的Get,Post那些地址为https开头的网站了。
不过这样仍然不行,当运行程序时,会报错“Could not load SSL library”,这是因为

TIdSSLIOHandlerSocket控件需要OpenSSL Library来配合,OpenSSL Library包含有两个动态链接库

libeay32.dll和ssleay32.dll。
OpenSSL Indy版下载 http://indy.fulgan.com/SSL/

或http://download.csdn.net/detail/netcreate/3498085(经测试,delphi 2010下的indy可以用)


将这个rar解包释放两个dll到你的程序目录即可,但是我这样做完以后post数据还是不行,发现

idhttp这里有个版本的选项Method,默认的是sslvSSLv2,改为sslvSSLv3,post返回数据正常,

yeah~仔细看了看,这个属性是IdSSLIOHandlerSocket1的。

写一个登录HTTPS协议网站的工具,想用INDY实现
现在老是会报错“Could not load SSL library”,可是我已经把ssleay32.dll和libeay32.dll两个

库文件拷进去了,是不是要专门支持D7的库文件才可以.

有类似的代码也可以提供参考一下,非常感谢!

是的,在Indy10.0.5之前的版本所使用的OpenSSL是Indy特别的版本
Indy10.2.3之前仅支持OpenSSL的0.9.8以前的版本
Indy10.2.3及之后才支持… 

 

加载https的站点页面内容的时候记得在窗体上加上IdSSLIOHandlerSocketOpenSSL1

以及idhttp里面IOHandler为IdSSLIOHandlerSocketOpenSSL1

不然老报错IOHandler value is not valid.错..

 

复制代码
uses
  IdHTTP,
  IdSSLOpenSSL,
  SysUtils;

Var
  IdHTTP1 : TIdHTTP;
  Src : string;
  LHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  try
   IdHTTP1:=TIdHTTP.Create(nil);
   try
    LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      IdHTTP1.IOHandler:=LHandler;
      Src:= IdHTTP1.Get('https://tools.usps.com/go/ZipLookupResultsAction!input.action?resultMode=0&companyName=&address1=1600+PENNSYLVANIA+AVE+NW&address2=&city=&state=Select&urbanCode=&postalCode=&zip=20500');
      Writeln(Src);
    finally
      LHandler.Free;
    end;
   finally
     IdHTTP1.Free;
   end;
  except on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
复制代码

 

 

 

我自己用的:(这个估计非常完善了,非常好了,兼容一号店 对接乱码的问题)

复制代码
function THtpApi.MyHtpPost(const MyPostUrl: string; const MyCanShuList: TStringList): string;
var
  MyHtp: TIdHTTP;
  MyStream: TStringStream;
  MyIoHd: TIdSSLIOHandlerSocketOpenSSL;
begin
  MyHtp := TIdHTTP.Create(nil);
  MyStream := TStringStream.Create('', TEncoding.UTF8);
  MyIoHd := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    MyHtp.IOHandler := MyIoHd;
    MyHtp.Post(MyPostUrl,MyCanShuList,MyStream,IndyTextEncoding_UTF8);
    Exit(MyStream.DataString);
  finally
    MyHtp.Free;
    MyStream.Free;
    MyIoHd.Free;
  end;
end;
复制代码

 

 //2014-05-06 补充====真的需要这两个文件,我靠否则报下面的错误,因为我电脑上 delphi 根目录下有 所以就没有 报错,但是客户的电脑上没有=======

 

 

 

 

======================经过测试必须放到软件根目录下,任何名字的子目录都不行===================

 

后来发现很多软件 也都有 这个,靠 看来 以后 https 的post 就必须包含 这两个 dll 了。

 

---------------------------------------

 

目前主要是 阿里巴巴的 refreshToken 的时候 是https + post 方法 ,所以需要用到 这个,如果以后 阿里巴巴 不需要 refreshtoken 了就没有作用了,可以去掉了

posted on   del88  阅读(616)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示