整合很无聊。 也是不可避免的。 但是我不会写有关企业集成模式的文章 。 相反,我将解释如何创建与Zapier集成的应用程序。
什么是Zapier ? 它是一项服务,使您可以通过其API(或协议)连接两个(或多个)不连接的服务。 您可以执行“从Evernote笔记创建Trello任务”,“将新的RSS项发布到Facebook”,“将新的电子邮件添加到电子表格”,“将日历会议后发布到Slack”,“将大的电子邮件附件保存到Dropbox”等操作”,“将所有instagram推到某个喜欢阈值以上”,等等。 实际上,它涵盖的范围几乎与我真正喜欢的另一项著名服务-IFTTT (如果是那样的话)相同 ,其中我最喜欢的用例是“国际空间站经过您的房间时获得通知”。 所有这些交互都可以通过UI进行配置。
现在,这对最终用户来说很好,但是它与软件开发和集成有什么关系? Zapier(与IFTTT不同,不幸的是)允许包含自定义的第三方服务。 因此,如果您拥有自己的服务,则可以创建一个“应用程序”,并允许用户将您的服务与所有其他第三方服务集成。 IFTTT提供了一种调用Web终结点(包括RESTful服务)的方法,但是它不允许设置标头,因此对于实际的API而言,它非常有限。
在本文中,我将简要说明如何编写自定义Zapier应用,然后从架构角度讨论诸如Zapier之类的服务所处的位置。
我需要它的目的是-能够将LogSentinel与可通过Zapier获得的任何第三方集成,即存储所有所有第三方系统中发生的事件的审核日志。 那我该怎么做呢? 有一个教程使它看起来很简单。 确实有一些问题。
首先,有两个教程- 一个在GitHub上 , 一个在Zapier的网站上 。 而且它们略有不同,在某些情况下会变得棘手。
我最初遵循GitHub教程,但构建失败。 它声称缺少zapier平台依赖性。 在将其与示例应用程序进行比较之后,我发现zapier平台依赖项前面有一个插入符号。 删除它只会产生另一个错误-我的节点版本应为6.10.2。 为什么?
Zapier CLI要求您完全安装了6.10.2版本。 您会看到错误,否则将无法继续
看来他们使用的是固定在Node 6.10.2上的AWS Lambda (实际上,当您检查时为6.10.3)。 当前的主要版本是8,因此在选择…javascript作为命令行工具和构建沙盒应用程序时要注意点。 也许其他决定也有缺点,我不会猜测。 也许只是我不喜欢动态语言 。
因此,在确保节点上具有正确的旧版本之后,请调用zapier init
并确保没有zapier test
, npm install
和zapier test
。 到目前为止,您还拥有一个虚拟应用程序。 现在,您如何对服务进行RESTful调用?
Zapier将可编程实体分为“触发”和“创建”两部分。 触发器是触发整个应用程序的事件,其结果是“创建”。 就我而言,我的应用程序不发布任何触发器,它仅接受输入,因此我不会提及触发器(尽管它们看起来很简单)。 您配置index.js中的所有元素(例如, 这一元素):
const log = require('./creates/log');
....
creates: {
[log.key]: log,
}
log.js文件本身是有趣的一点–您在其中指定应传递给API调用的所有参数,以及进行API调用本身:
const log = (z, bundle) => {
const responsePromise = z.request({
method: 'POST',
url: `https://api.logsentinel.com/api/log/${bundle.inputData.actorId}/${bundle.inputData.action}`,
body: bundle.inputData.details,
headers: {
'Accept': 'application/json'
}
});
return responsePromise
.then(response => JSON.parse(response.content));
};
module.exports = {
key: 'log-entry',
noun: 'Log entry',
display: {
label: 'Log',
description: 'Log an audit trail entry'
},
operation: {
inputFields: [
{key: 'actorId', label:'ActorID', required: true},
{key: 'action', label:'Action', required: true},
{key: 'details', label:'Details', required: false}
],
perform: log
}
};
您可以将输入参数传递给API调用,就这么简单。 然后,用户可以指定源(“触发”)中的哪些参数应映射到您的每个参数。 在一个示例zap中,我使用了电子邮件触发器,并将发件人作为actorId传递,将目标作为“ action”传递,并将电子邮件正文作为详细信息传递。
还有一件事-身份验证。 身份验证可以通过多种方式进行。 一些服务提供OAuth,其他服务-HTTP Basic或其他自定义身份验证形式。 文档中有关于所有选项的一节。 就我而言,它(几乎)是HTTP Basic身份验证。 我最初的想法是仅将凭据作为参数提供(您只需对其进行硬编码,而不是映射到触发参数)。 这可能有效,但这不是规范的方法。 您应该配置“身份验证”,因为它会为用户触发友好的UI。
您包括authentication.js (具有身份验证所需的字段),然后通过添加标头(在index.js中)来预处理请求:
const authentication = require('./authentication');
const includeAuthHeaders = (request, z, bundle) => {
if (bundle.authData.organizationId) {
request.headers = request.headers || {};
request.headers['Application-Id'] = bundle.authData.applicationId
const basicHash = Buffer(`${bundle.authData.organizationId}:${bundle.authData.apiSecret}`).toString('base64');
request.headers['Authorization'] = `Basic ${basicHash}`;
}
return request;
};
const App = {
// This is just shorthand to reference the installed dependencies you have. Zapier will
// need to know these before we can upload
version: require('./package.json').version,
platformVersion: require('zapier-platform-core').version,
authentication: authentication,
// beforeRequest & afterResponse are optional hooks into the provided HTTP client
beforeRequest: [
includeAuthHeaders
]
...
}
然后您zapier push
您的应用程序,然后可以zapier push
进行测试。 它不会自动启用,因为您必须邀请人们先尝试并使用它 ,但在许多情况下就足够了(即与特定客户端集成时使用Zapier)
Zapier可以用于任何集成问题吗? 不太可能–它非常有限且简单,但这也是一种优势。 您可以在半天的时间内针对最典型的用例使您的服务与数千个其他服务集成。 并不是说,尽管这是为了集成公共服务而不是企业集成(在其中使多个内部系统互相通信),但是随着越来越多的系统依赖第三方服务,它可以在企业系统中找到家,取代ESB的某些功能。
实际上,此类服务(Zapier,IFTTT)是“简单的ESB即服务”。 您进入UI,填充了许多字段,并且系统彼此交谈,而无需接触系统本身。 我不是ESB的忠实拥护者 ,主要是因为随着时间的推移,它们变得越来越难以支持。 但是,在某些情况下,极简的,外部的可能适用。 尽管此类服务主要针对最终用户,但它们在依赖第三方服务的企业体系结构中可能是有用的一点。
是否可以处理所需的负载,组织是否愿意让其数据流经第三方提供程序(可以存储中间参数),这是一个需要逐案回答的问题。 我不建议将其作为一般解决方案,但当然可以考虑。
翻译自: https://www.javacodegeeks.com/2018/02/integration-with-zapier.html