API hooks/callbacks 的最佳实践?

Best practices for API hooks/callbacks?

假设我有网络applicatons/services:

API用于管理一些资源(简单的CRUD操作)。现在我需要的是订阅 Applications 以获取不同 API 资源的变化。 应用程序 会在更改时做一些背景工作。


我想到了回调。这样 Applications 可以 oauthorise 和 post 到 API回调配置。

我认为这个配置应该是这样的:

{
  'callback_url': 'http://3rdpartyservice.com/callback',
  'resources':    ['foo1', 'foo2'],
  'ref_data':     { 'token': 'abcd1234' }
}

这种方式在指定资源上更改 API 将向 callback_url 发送请求。此请求将包含资源数据、action(create/update/delete) 和 ref_data.

这里的目的是使这个足够通用以允许第 3 方客户端配置此类回调。


所以问题是:

  1. 有什么最佳做法吗?
  2. 安全潜在问题如何?
  3. 网络上有真实世界的例子吗?

发送

听起来与 WebHooksService Hooks.

非常相似

查看 Web Hooks on GitHub, to get a good idea what they are and how they work. See also last alinea Service Hooks, as it explains how github handles these WebHooks. This would be similar for your application. The OAuth 解释为什么以及如何完成。

另见 Webhooks, REST and the Open Web, from API User Experience

还有RestHooks.

这个需求的一般解决方案通常叫做"publish/subscribe"。有许多解决方案 - google "publish subscribe REST" 举一些例子。您还可以阅读“Enterprise Integration Patterns”。

他们在这种解决方案中的主要挑战是 "real-time versus queue"。

例如,如果您的 API 拥有一百万个客户,他们都对同一事件感兴趣,则您无法保证在任何时间范围内都能实时接触到所有这些客户的申请需要。您还必须担心网络中断或客户端暂时关闭。在这种情况下,您的应用程序可能会定义一个事件队列,客户端会在该队列中查找他们感兴趣的事件。一旦您沿着这条路线走下去,您可能会使用一些现成的软件而不是构建你自己。 Apache Camel 是一个很好的开源实现。

例如,在您的示例中,如果您无法到达 3rdpartyservice.com 会怎样?或者,如果 http://3rdpartyservice.com/callback throws an error when posting an update to foo1, but not to foo2? Or if http://3rdpartyservice.com/ uses a different flavour of OAuth than you're used to? How do you guarantee http://3rdpartyservice.com/ 发布更新的是您,而不是黑客?

您的选择实际上往往归结为您的非功能性需求,而不是功能性需求 - 诸如正常运行时间、通知保证、交付保证等比您如何传递的细节更重要参数,以及它是 "resource-based" 还是其他协议。