与Zapier集成

整合很无聊。 也是不可避免的。 但是我不会写有关企业集成模式的文章 。 相反,我将解释如何创建与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 testnpm installzapier 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.applicationIdconst 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 uploadversion: require('./package.json').version,platformVersion: require('zapier-platform-core').version,authentication: authentication,// beforeRequest & afterResponse are optional hooks into the provided HTTP clientbeforeRequest: [includeAuthHeaders]
...
}

然后您zapier push您的应用程序,然后可以zapier push进行测试。 它不会自动启用,因为您必须邀请人们先尝试并使用它 ,但在许多情况下就足够了(即与特定客户端集成时使用Zapier)

Zapier可以用于任何集成问题吗? 不太可能–它非常有限且简单,但这也是一种优势。 您可以在半天的时间内针对最典型的用例使您的服务与数千个其他服务集成。 并不是说,尽管这是为了集成公共服务而不是企业集成(在其中使多个内部系统互相通信),但是随着越来越多的系统依赖第三方服务,它可以在企业系统中找到家,取代ESB的某些功能。

实际上,此类服务(Zapier,IFTTT)是“简单的ESB即服务”。 您进入UI,填充了许多字段,并且系统彼此交谈,而无需接触系统本身。 我不是ESB的忠实拥护者 ,主要是因为随着时间的推移,它们变得越来越难以支持。 但是,在某些情况下,极简的,外部的可能适用。 尽管此类服务主要针对最终用户,但它们在依赖第三方服务的企业体系结构中可能是有用的一点。

是否可以处理所需的负载,组织是否愿意让其数据流经第三方提供程序(可以存储中间参数),这是一个需要逐案回答的问题。 我不建议将其作为一般解决方案,但当然可以考虑。

翻译自: https://www.javacodegeeks.com/2018/02/integration-with-zapier.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python用psf函数_python学习之-类的内置函数

内置方法:__str__(该方法必须返回字符串类型),在对像被打印时自动触发,然后将该方法的返回值当做打印结果输出)class People:def __init__(self,name,age):self.namenameself.ageagedef __str__(self): #绑定给对象的方法return ‘‘ %(self.name,self.age) #这个方…

多用户远程连接mysql_Mysql权限控制 - 允许用户远程连接

Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作:一、允许root用户在任何地方进行远程登录,并具有所有库任何操作…

cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务

cxf 服务端soap报文在上一篇文章中,我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤。 在本文中,我将讨论使用CXF开发SOAP Web服务。 在继续前进之前,让我们先了解一下构成SOAP Web服务的概念/元素 SOAP或简单对象访问协议 SOAP是一…

Java 8日期和时间

如今,一些应用程序仍在使用java.util.Date和java.util.Calendar API,包括使我们的生活更轻松地使用这些类型的库,例如JodaTime。 但是,Java 8引入了新的API来处理日期和时间,这使我们可以对日期和时间表示进行更精细的…

php mysql 随机字符串_MySQL_Mysql 自定义随机字符串的实现方法,前几天在开发一个系统,需要 - phpStudy...

Mysql 自定义随机字符串的实现方法前几天在开发一个系统,需要用到随机字符串,但是mysql的库函数有没有直接提供,就简单的利用现有的函数东拼西凑出随机字符串来.下面简单的说下实现当时.1.简单粗暴.select ..., substring(MD5(RAND()),floor(…

python哪些类型可以作为迭代器_python0.8-----set类型与迭代器

set:类似dict,是一组dict的集合,不存储value。本质:无序(没有下标)无重复的元素的集合。创建:创建set需要一个list或者tuple或者dict作为输入集合。重复元素在色中会被自动过滤。s1[1,2,3,4,5,6,1,2]set(s1){1,2,3,4,5,6} --表示》…

线程池实现填充短信_填充一个池需要多少个线程?

线程池实现填充短信在最近几个月中,我们一直看到很小但持续的操作失败,但有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接; 嵌套异常是java.sql.SQLException:客户端尝试检出…

python线性回归x可以数量不一样吗_R和Python中的线性回归 - 在同一问题上的结果不同...

只是指出这一点: statsmodel s least squares fit does by default not include a constant. If we remove the constant from R适合,我们得到与Python实现非常相似的结果,或者相反,如果我们向 statsmodel -fit添加一个常量&#…

PostgreSQL开放自由

Open Liberty是源自WebSphere Liberty的有趣的新型OSS Java EE应用服务器。 您可以将Open Liberty配置为使用PostgreSQL作为其默认数据源&#xff0c;如下所示&#xff1a; 将<datasource> &#xff0c; <jdbcDriver>和<library>指令添加到server.xml配置中…

实现mysql百度式查询_mysql查询优化建议(百度)

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中使用!或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在 where 子句中对字段进行 null 值判断…

海思芯片怎么使用tde给qt加速_3519移植Qt适配附件

【实例简介】修改Qt5.5.1linuxfb插件代码&#xff0c;适配海思3519平台【实例截图】【核心代码】3519Qt移植.tar├── 3519Qt绉绘│ ├── linuxfb│ │ ├── include│ │ │ ├── acodec.h│ │ │ ├── fisheye_calibrate.h│ │ │ ├─…

jsf标签_多个动态包含一个JSF标签

jsf标签每个JSF开发人员都知道ui&#xff1a;include和ui&#xff1a;param标签。 您可以包括一个facelet&#xff08;XHTML文件&#xff09;并传递一个对象&#xff0c;该对象将在包含的facelet中可用&#xff0c;如下所示&#xff1a; <ui:include src"/sections/co…

用Java比较文件

我正在为PACKT创建一系列有关Java网络编程的视频教程。 有整节关于Java NIO。 一个示例程序是通过原始套接字连接将文件从客户端复制到服务器。 客户端从磁盘读取文件&#xff0c;服务器将到达的字节保存到磁盘。 因为这是一个演示&#xff0c;所以服务器和客户端在同一台计算机…

java哈希_Java如何采用哈希码实现分类(以员工分配为例)

5.总程序&#xff1a;下面代码是我们获取的所有的程序代码&#xff0c;如下&#xff1a;public static void main(String[] args) {Scanner scannew Scanner(System.in);System.out.println("请输入员工姓名&#xff1a;");String namescan.nextLine();System.out.pr…

java反射的原理_java反射机制的实现原理

java反射机制的实现原理反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。下面具体介绍一下java的反射机制。这里你将颠覆原来对java的理解。Java的反射机制的实现要借助于4个类&#xff1a;class&…

java linkedlist 用法_Java LinkedList addLast()用法及代码示例

Java中的java.util.LinkedList.addLast()方法用于在LinkedList的末尾插入特定元素。用法:void addLast(Object element)参数&#xff1a;此函数接受单个参数element &#xff0c;如上面的语法所示。此参数指定的元素将附加在列表的末尾。返回值&#xff1a;此方法不返回任何值。…

spring 长轮询_Spring集成文件轮询和测试

spring 长轮询我最近实施了一个小项目&#xff0c;在该项目中&#xff0c;我们必须轮询文件夹中的新文件&#xff0c;然后在文件内容上触发服务流。 Spring Integration非常适合此要求&#xff0c;因为它带有一个通道适配器 &#xff0c;该适配器可以扫描文件夹中的新文件&…

java扫描指定package注解_java获取包下被指定注解的类

方案一&#xff1a; 采用reflections 框架(此框架依赖com.google.guava)2、项目依赖org.reflectionsreflections0.9.11com.google.guavaguava21.03、实现代码//入参 要扫描的包名Reflections f new Reflections("com.ggband.netty.execute.command");//入参 目标注解…

您将在下一个项目中使用JSF吗?

上周有一篇很棒的stackoverflow博客文章&#xff0c;主题是“ JavaScript框架的残酷生命周期” 。 这篇文章是关于Javascript UI框架&#xff08;angularjs&#xff0c;angular&#xff0c;jquery和react&#xff09;的流行和流行的速度。 这篇文章的关键指标是每月关于框架的问…

java dao层 service层_dao层与service层的区别

service是业务层&#xff0c;dao是数据访问层。这个问题我也曾经考虑过学java的时候&#xff0c;都是在service里直接调用dao&#xff0c;service里面就new一个dao类对象&#xff0c;调用&#xff0c;其他有意义的事没做&#xff0c;也不明白有这个有什么用然后百度了一下我们都…