Zapier/IFTTT如何为不同的API提供商实现触发器和操作?是否有通用的方法来做到这一点,或者它们是由个人实现的?
我认为实现是基于REST/Oauth,这是通用的从高层次看。但是对于Zapier/IFTTT,它定义了很多触发条件,过滤器。这些条件、过滤器应该特定于不同的提供者。相应的实现是单独的还是通用的?如果在个人,必须有一个庞大的劳动力。如果是通用的,怎么做呢?
Zapier开发人员在这里-简短的回答是,我们实现了每一个!
虽然像OAuth这样的标准使得从一个API到另一个API之间重用一些代码变得更容易,但无法回避这样一个事实,即每个API都有唯一的端点和唯一的需求。适用于一个API的东西不一定适用于另一个API。在内部,我们已经将尽可能多的流程抽象为可重用的位,但是添加新API总是涉及一些工作。
PipeThru developer here.
每个API都有可以重用的公共元素,比如OAuth身份验证、公共数据格式(JSON、XML等)。大多数api都力求RESTful实现。然而,理论遇到现实,大多数api到处都是。
每个服务都提供自己的端点,对于给定的服务没有一致同意的正确端点集。例如,在CRM软件中,不清楚如何表示一个人、该人的备注、相应的电话号码、地址以及活动。您提供一个端点还是多个端点?如何更新它们?你是否提供与记录无关的记录(如公司为个人)?每个都需要对该服务的特定知识以及一些数据规范化。
大多数触发器涉及检查新记录(唯一id)或更新字段,最常见的是最后一次更新时间戳。大多数服务以ISO 8601格式表示它们的时间戳,这使得解析时间戳变得容易,但并非所有服务都是如此。Dropbox实际上提供了一个增量API端点,您可以向其提供哈希值,Dropbox将向您发送从该点开始的所有新/更改的内容。我喜欢在更多的api中看到增量和/或活动端点。
归根结底,集成每个单独的服务确实需要大量的工作和测试。
我要指出Zapier确实实现了一个API,其他公司可以将其插入到他们的工具中。而不是Zapier实现你的API和Zapier轮询你的数据,你可以发送新的/更新的数据到Zapier触发他们的一个zap。我喜欢把这想象成吸毒。这使得Zapier可以支持更多的服务,而不必对每个服务进行编程。
我已经在Zapier上实现了一些api,所以我认为我至少可以在这里提供部分答案。如果不使用webhooks, Zapier将检查来自服务的API响应,以查找包含字符串"id"的最短名称字段。对该字段的更改将导致Zapier触发一个任务。这是基于id通常是增量或随机的假设。
我不得不通过将id值转移到另一个字段并在id未能触发或触发过于频繁时写入不同的值来解决这个问题(例如,除以10然后写入id可以降低触发灵敏度)。歧义也是一个问题,例如在包含post_id和mesg_id字段的API响应中。
简短的回答是,系统做出了一个有根据的猜测,但是为了使它对特定的服务可靠地工作,您应该在代码中非常具体地说明触发事件的构成。