如何让Delphi XE2通过SSL与Google Calendar API对话?

War*_* P 14 delphi openssl indy delphi-xe2

这是再次提出这个问题的时候了,但这次使用的是Delphi XE2.

我正在使用XE2附带的Indy版本10.5.8.0,我尝试了四种不同版本的SSL dll.我已经尝试了1.0.x最新版本,以及大约3种不同的0.9.8版本(e,h,x,....).

当他们在calendar.google.com上与https:// urls进行通信时,它们都不起作用." Sync-components.com " 上的Delphi Google Calendar组件的作者提供了他自己的二进制openssl DLL运行时,其中没有版本信息,但它似乎是一个非常小的,非常旧版本的早于0.9的SSL库. 8.该组件的作者说,只有他的私有无版DLL才有效.我简直不敢相信.当然,至少有一个版本的openSSL dll可以与Delphi XE2连接到Google Calendar.

为了让他的自定义古代DLL加载到Delphi XE2中的Indy 10中,他修改了IdSSLOpenHeaders.pas方法Load,就像这样,最后:

 function Load: Boolean;
 begin
   /// ... lots of stuff
   //Result := (FFailedFunctionLoadList.Count = 0); // original.
   Result := (FFailedFunctionLoadList.Count <= 18); // changed to.
 end;
Run Code Online (Sandbox Code Playgroud)

当然,我正在评估的组件在XE2中不起作用,但我怀疑它是(a)与XE2一起提供的Indy 10的这个特定快照,或者(b)SSL DLL世界的事实的破坏.一个名副其实的"为你而破碎但为我工作"的不同版本.

在Delphi XE2中,如何使用Indy(或任何其他支持SSL的delphi组件库)与Google Calendar建立SSL连接?

或者,如果任何人都有谷歌日历API实现,可以使用Indy以外的任何我可以用来测试的东西,我会很感激链接和指针.

War*_* P 6

与XE2一起提供的Indy10的快照有问题,因为idHTTP对象似乎与我找到的任何OpenSSL dll都不兼容,因为我无法与任何Google Calendar服务器通信.

问题的实际潜在性质似乎是Indy不像我们希望的那样透明地处理HTTP重定向.操纵Indy(第三方组件)的代码使用Indy"http重定向"处理逻辑做了一些非常难以理解的事情,这些逻辑似乎是一组解决方法,但是不起作用.更令人困惑的是,HTTP重定向发生的代码中的确切位置因测试Google日历的人而异,因此这些重定向故障并不总是出现在每个测试它的人的相同位置.

请注意,登录方法和获取日历的方法都有效.但是阅读事件的方法和代码似乎不起作用.我无法弄清楚两者之间的区别,但我使用的代码是商业代码,我不能发布任何代码.如果我弄清楚HTTP get请求在其响应中返回"0字节"的实际技术原因,我将更新此消息,如下所示:

https://www.google.com/calendar/feeds/firstname.lastname%40gmail.com/private/full?max-results=100000
Run Code Online (Sandbox Code Playgroud)

那些零字节结果实际上是HTTP 302重定向响应代码,我正在使用的代码没有检查或期望.期待Indy自动处理重定向.

问题可能是Indy10版本非常具体,只适用于我今天搜索时没有找到的openSSL dll版本,或者XE2附带的Indy10版本不适用于任何版本的我能找到的OpenSSL dll,至少不是当它与之交谈的目标是google的HTTPS日历服务器时.

我正在运行的代码使用TIdSSLIOHandlerSocketOpenSSL创建一个IdHTTP对象.

这适用于所有版本的Delphi,包括XE,但由于Indy版本附带XE2,因此打破了工厂XE2系统.

我找到的唯一修复是安装一个新的Indy每晚构建,我抓住了4760,当与OpenSSL dll版本1.0.1结合使用时,它似乎工作正常.

在我看来,使用OpenSSL与Delphi XE2开箱即用有点困难.非常感谢Indy团队努力工作......但有人可以帮助他们吗?这真是一个伟大的项目和一个伟大的产品,但当它打破,当你必须遵循移动标准(如openSSL实现),也许更多的文档,测试和眼球会有所帮助.如果有人能告诉我如何帮助我,我随时准备提供帮助.SSL的问题不是特定于indy的,因为我注意到其他组件供应商和开源人员都有他们支持或不支持的OpenSSL dll的特定版本.

我今天学到的另一件令人伤心的事情是:OpenSSL的一些安装程序默认情况下(没有警告)将他们的DLL安装到你的Windows System32目录中,不仅导致你的应用程序,而且其他人,如TortoiseHG和TortoiseSVN,可能会破坏.如果您在开始玩游戏之前没有遇到大问题,那么如果您从OpenSSL网站安装一堆安装程序版本,则可能会让情况变得更糟.

  • 我总是在应用程序目录中有所需的dll以避免安装问题.如果第三方API的版本特定于您的项目,则始终可以在本地访问这些文件. (2认同)