Add Webhooks to Your API the Right Way
Add Webhooks to Your API the Right Way
In the last 10 years, APIs have gone from nice-to-have to must-have, certainly for Software-as-a-Service (SaaS) applications. At the same time, users today are more impatient and expect more instant and interconnected apps. To answer user needs, developers are now adding webhooks to their APIs. Webhooks are the mechanism through which data from an API can be delivered proactively, without receiving a request for each response. We’ve found that given loose constraints, there are many ways developers might implement webhooks.
This post shares some high-level insights behind why you should include webhooks and how to add them to your API the right way.
Why you want to create webhooks
An event-driven approach ensures you can send the right notification to the right application at the time it occurs.
Webhooks are an architectural pattern that enable developers to receive updates to data as they happen rather than polling for the latest updates. The investment you put in up front building a webhook-enabled API can save your system resources and delight developers and end users alike.
A typical API lets developers read the latest data from your application. Perhaps they can query for specific data and may even be able to write new data if they have appropriate permissions. These sort of CRUD operations (Create, Read, Update, and Delete) provide the basic elements needed to emulate the functionality of your application.
However, your application exists within a network of other applications. Since changes to your user data affects many others, you need a robust model that takes this reality into account. An event-driven approach ensures you can send the right notification to the right application at the time it occurs.
Let’s say one feature of your application includes contacts, each of which has a name, email address, and phone number. The moment a new contact is added to your application, some other application may want to use that data to send a text message, look up their email address in another system, or backup the contact data. Without a way to alert other applications when a new contact is added, you force them to constantly poll for new data.
Polling is bad for everyone. It’s taxing to servers on both sides, which spend most of their time and resources with requesting responses that contain nothing new. When there is data, it’s only as new as the polling interval, which means it might not even satisfy a user’s thirst for instant data access. Other than webhooks, the only way to have up-to-the-second access to new data is to poll every second. While some developers may try that, it’s not likely to be sustainable.
Webhooks will make your end users happy, delight developers who use your API, and give your servers a break. So how do you get yourself some of this triple-win?
Create your subscription endpoint
Before sending notifications as webhooks, you need to know what to send notifications about. That’s where a subscription endpoint comes in handy. Developers will “subscribe” to certain actions and tell you where to send notifications.
Note: You may be familiar with adding a single webhook URL into an admin interface when working with other APIs. That is called a static webhook and is not recommended for robust subscription notifications. Static webhooks can only notify one URL and are limited to a single set of criteria. Plus, a user needs to manually add every notification they want. By comparison, subscription webhooks allow a single application to receive multiple types of notifications. Each can be added via API so a user is not required to interact with each subscription set up.
For most apps implementing webhooks, they already have an API. Even if you’re starting fresh, you’re likely planning out the endpoints for your API, which map to resources in your app. Sticking with the example in the previous section, your app might store contacts. For your API, the endpoint would be something like /contacts. You’ll make another endpoint for webhooks, such as /webhook, and treat it like any resource for your API.
| action | description |
|---|---|
| GET /webhook | List existing webhooks |
| POST /webhook | Subscribe to a new webhook with details sent in JSON body |
| GET /webhook/{id} | Retrieve details of an existing webhook |
| PUT /webhook/{id} | Update an existing webhook with details sent in JSON body |
| DELETE /webhook/{id} | Unsubscribe from an existing webhook |
Your /webhook endpoint would likely have the actions listed above, which would allow you to list, create, read, update, and delete webhooks.
Important: You would need to store and retrieve the data with the same security that you use to access the other resources in your application. That is, an external developer shouldn’t be able to work with a webhook {id} that is not registered to the account of the authenticated user.
When creating or updating a webhook, developers will need to pass details in the body of the request. At a minimum, you’ll need to accept a resource or events to watch for changes and a target URL (where to send the notifications). A common convention is to use noun.verb notation for describing webhooks, such as contact.create and contact.update. Whatever you choose, be consistent, and remember to send it along with each notification.
You’ll want to think about what criteria you need to determine what notifications to send. For example, you might have notifications for all new contacts or for updates to a specific contact id. Start with just the most common events. It’s easy to add more events later, but painful to remove them, especially once developers are depending on them.
Of course, with your webhook endpoint set up, all this does is track the webhooks. You’ll need another process to actually identify the times when we need to send notifications.
Implement your webhook queue
Now that you have a way for developers to subscribe to webhooks and update settings, you're ready to start sending notifications when the criteria matches. But when should you check the criteria and send the notifications? There are a few approaches you can take, each with its own advantages, complexity, and scalability.
- Do it inline: This is the simplest and most naive approach and should be reserved for prototypes or test environments. When an event occurs that might activate a webhook (such as a user adds a new contact), check whether a webhook fits the criteria. For all webhooks that do match, fire off a connection to the URL on file. The questionable part, for scaling, is making the request inline while the end user waits. A better solution is to create a queue so you can better deal with timeouts and retries.
- Create a DB queue: When you send webhooks inline, all your code is in one place. With this option, you’ll be creating a record in your existing database for each notification you need to send. Rather than initiating a connection immediately, you’ll need a separate process to frequently look for new notifications and send them. Since the end user isn’t waiting, timeouts are not as big of a concern. And if you need to retry a notification, just keep it marked active until it succeeds or is called the maximum number of times.
- Use a proper queue: If you know you’ll need to scale your solution, use a tool specifically designed for that. You can use open source scalable queueing solutions like RabbitMQ or a service like Amazon Simple Queuing Service. This way, your interaction is limited to adding and removing “messages,” which tell you what webhooks to call. Like the DB queue, you need a separate process to consume items from the queue and send notifications. In addition to using a tool designed for this purpose, a proper queue also saves database resources for what it does best–providing data to your primary application.
Tip: Whichever choice you use for queuing your webhook notifications, you’ll want to send them as quickly as you can. It may be tempting to run a cron job every minute, but a minute is a long time to wait for someone who wants to see if your webhooks work.
This post has covered a few of the high-level architectural decisions you’ll need to make as you implement webhooks. In the future, we’ll look at methods of retrying webhooks, authenticating payloads, and other factors of successful webhooks, some of which is covered in the RESTHooks documentation.
Keep reading: Learn how to use webhooks with Zapier.
Want to be first to know about new webhook, API, and other developer posts? Be sure to subscribe to the engineering blog.
原文地址:https://zapier.com/engineering/webhook-design/
Add Webhooks to Your API the Right Way的更多相关文章
- Professional C# 6 and .NET Core 1.0 - Chapter 42 ASP.NET Web API
本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处: -------------------------------------------------------- ...
- 在Web Api中集成protobuf
安装WebApiContrib.Formatting.ProtoBuf Install-Package WebApiContrib.Formatting.ProtoBuf 注册ProtoBufForm ...
- ASP.NET Web API 异常日志记录
如果在 ASP.NET MVC 应用程序中记录异常信息,我们只需要在 Global.asax 的 Application_Error 中添加代码就可以了,比如: public class MvcApp ...
- [转载] FFmpeg API 变更记录
最近一两年内FFmpeg项目发展的速度很快,本来是一件好事.但是随之而来的问题就是其API(接口函数)一直在发生变动.这么一来基于旧一点版本的FFmpeg的程序的代码在最新的类库上可能就跑不通了. 例 ...
- [转]HTML5 classList API
Having thrust myself into the world of JavaScript and JavaScript Libraries, I've often wondered: Whe ...
- FFmpeg API 变更记录
最近一两年内FFmpeg项目发展的速度很快,本来是一件好事.但是随之而来的问题就是其API(接口函数)一直在发生变动.这么一来基于旧一点版本的FFmpeg的程序的代码在最新的类库上可能就跑不通了. 例 ...
- ASP.NET MVC和Web API中的Angular2 - 第1部分
下载源码 - 903.5 KB 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索 ...
- Using MongoDB with Web API and ASP.NET Core
MongoDB is a NoSQL document-oriented database that allows you to define JSON based documents which a ...
- twitter api
1,twurl安装 1.1,安装软件管理包工具,在管理员身份打开的cmd中执行: @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powersh ...
随机推荐
- hdu_5154 拓扑
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
- 提高FPGA速度的quartus编译选项
Turning on some optimizations in Quartus II may help increase it. Here are some you may want to try: ...
- Windows 绝赞应用(该网站收集了日常好用的工具和软件)
在我们的电脑使用过程中,或多或少的被流氓软件恶心过.流氓软件之所以这么流氓全是靠他那恐怖的用户数量,基本上形成垄断后,各种流氓行为就一点点体现出来了. 我们也可以选择不用,但对流氓软件来说多你一个不多 ...
- 3339: Rmq Problem
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1269 Solved: 665[Submit][Status][Discuss] Descripti ...
- PostgreSQL Replication之第四章 设置异步复制(7)
4.7 冲突管理 在PostgreSQL中,流复制数据仅在一个方向流动.XLOG由master提供给几个slave,这些slave消耗事务日志并为您提供一个较好的数据备份.您可能想知道这怎么会导致冲突 ...
- python制造模块
制造模块: 方法一: 1.mkdir /xxcd /xx 2.文件包含: 模块名.py setup.py setup.py内容如下:#!/usr/bin/env pythonfrom distutil ...
- JAVA程序类加载及其反射机制
[IT168 技术]当调用java命令运行某个Java程序时,该命令将启动一条Java虚拟机进程,同一个JVM的所有线程,所有变量都处于同一进程里,它们都是用该JVM进程的内存区. 程序运行到最后正常 ...
- yii2.0缓存篇之文件缓存
文件缓存: 在 frontend/config/main.php/components数组下添加: 'cache'=>[ 'class'=>'yii\caching\FileCa ...
- 转移顺序的艺术 luogu4394 + lougu2966 + luogu3537
lougu4394: N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退 ...
- WebService通讯技术的CXF框架问题
WebService通讯技术的CXF框架问题 严重: Servlet /cxf_rs_spring threw load() exception java.lang.ClassCastExceptio ...