【问题标题】:How can I get Delphi XE2 to talk to Google Calendar APIs over SSL?如何让 Delphi XE2 通过 SSL 与 Google Calendar API 通信?
【发布时间】:2012-06-04 20:05:18
【问题描述】:

又到了this question 的时间,但这次是 Delphi XE2。

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

当与 calendar.google.com 上的 https:// 网址通信时,它们都不起作用。 “Sync-components.com”的 Delphi Google 日历组件的作者发布了他自己的二进制文件 openssl DLL 运行时中没有版本信息,但它似乎是比 0.9.8 更早的 SSL 库的非常小、非常旧的版本。该组件的作者说只有他的私有未版本化 DLL 可以工作。我不敢相信。当然,至少有一个版本的 openSSL dll 可以与 Delphi XE2 很好地连接到 Google 日历。

为了让他自定义的古代 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;

当然,我正在评估的组件在 XE2 中不起作用,但我怀疑这是因为 (a) XE2 附带的 Indy 10 的特定快照,或者 (b) World of SSL DLL 是一个名副其实的“对你来说很糟糕,但对我有用”的不同版本的地狱。

在 Delphi XE2 中使用 Indy(或任何其他支持 SSL 的 delphi 组件库)获得与 Google Calendar 的 SSL 连接,我必须做些什么?

或者,如果有人有一个谷歌日历 API 实现,可以与除 Indy 之外的任何东西一起工作,我可以用来测试,我会很感激链接和指针。

【问题讨论】:

  • 如果您有预算,请查看SecureBlackBox。他们有一个功能齐全的试用版。
  • 他们提供通用的 https 支持,但甚至没有 Google 日历 API 的演示,这让我想知道 Google 日历的 HTTPS 身份验证选项是否有一些奇怪的东西,因为这就是我要问的:不只是 SSL,还有 GOOGLE 服务器 ssl。

标签: delphi openssl delphi-xe2 indy


【解决方案1】:

XE2 附带的 Indy10 快照存在问题,因为 idHTTP 对象似乎无法与我发现的任何 OpenSSL dll 一起工作,因为我无法与任何 Google 日历服务器服务进行通信。 .

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

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

https://www.google.com/calendar/feeds/firstname.lastname%40gmail.com/private/full?max-results=100000

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

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

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

这适用于包括 XE 在内的所有 Delphi 版本,但由于 XE2 附带的 Indy 版本,因此与工厂 XE2 系统中断。

我发现的唯一解决方法是安装一个新的夜间版本的 Indy,我选择了 4760,当与 OpenSSL dll 版本 1.0.1 结合使用时,它似乎工作正常。

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

我今天了解到的另一件令人难过的事情:OpenSSL 的一些安装程序默认(没有警告)将其 DLL 安装到您的 Windows System32 目录中,这不仅会导致您的应用程序,而且会导致其他应用程序(例如 TortoiseHG 和 TortoiseSVN)可能中断。如果您在开始使用 SSL 之前没有遇到大问题,那么如果您从 OpenSSL website 安装一堆安装程序版本,您很容易让情况变得更糟。

【讨论】:

  • 我总是在应用程序目录中有所需的 dll 以避免安装问题。如果第 3 方 API 的版本特定于您的项目,则始终可以在本地访问文件。
  • 好点米莎。我计划在开发和部署期间这样做。
  • @WarrenP - 简而言之,您的建议是什么?就个人而言,我只是从不使用 Indy 的发布版本,而是使用 SVN 版本。当然,这不是免费的午餐,但我发现我更喜欢重新编译所有内容(Indy 和任何使用它的第三方组件),而不是遇到已发布版本的缺点(由于某种原因总是有一些问题)
  • 嗯,我的组件供应商说他使用 XE2 的发行版 Indy 一切正常,但是,当我使用 XE2 的 Indy 版本编译它时,甚至他自己的演示也被破坏了。最新最好的版本也不总是稳定的。所以你只需要支付你的钱并抓住你的机会。这并不理想,这就是为什么我在上一段中指出人们应该对 Indy + HTTPS 进行更多的社区 QA,也许 Indy 项目可以发布一些稳定版本并保留这些 zips。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2021-07-04
  • 2013-12-05
  • 2021-02-01
  • 2023-03-11
相关资源
最近更新 更多