HTTP消息是两个系统,通常是一个服务器和一个客户端,交换数据的常用手段。我们通常把每个HTTP消息称为HTTP请求或HTTP响应。
Webhook HTTP请求是HTTP请求的一个特定子集,它根据这些系统中的事件在系统之间传输数据。Webhooks被用于许多事件驱动的集成。
当与我们的客户一起工作时,我们发现有些人是Webhooks的新手,想了解更多关于Webhook HTTP请求的内容。如果你是这一类人,这篇文章应该会有帮助。
Webhook HTTP请求有哪些部分?
一个webhook HTTP请求通常由以下部分组成。
- 起始行
- 头部(s)
- 主体(有效载荷)
起始行。每个请求都有一个单一的起始行。它出现在请求的开头,包括方法、URL和版本。下面是一个起始行的例子。
POST /webhook/E474BA38/58E1/4544 HTTP/2
头部(s)。每个请求可以有零个或多个头。头信息通常描述关于请求的一些内容(如数据类型或HTTP客户端),但你可以为几乎任何目的创建自定义头信息。下面是头信息的例子。
Host: example.com
user-agent: curl/7.79.1
accept: */*
myapp-hmac-sha1: f237e4a4062590a674b0adc1e84614196aae79f4
myapp-api-key: 90B649F2-70F2-4180-95BC-951F5D832F0D
content-type: application/json
content-length: 188
**主体(有效载荷)。**每个请求(除了GET和DELETE的情况)都有一个单一的主体,可以是JSON、XML或一些二进制文件,尽管多部分请求可以将多种类型的数据编码到一个请求中。下面是一个主体的例子。
{
"orderId": "abc-123",
"state": "update",
"updates": [
{ "action": "remove", "item": "widgets", "quantity": 5 },
{ "action": "add", "item": "gadgets", "quantity": 20 }
]
}
当我们把所有的部分放在一起时,一个webhook HTTP请求(和相应的响应)可能看起来像这样。
curl https://example.com/ \
--verbose \
--request POST \
--header 'myapp-hmac-sha1: f237e4a4062590a674b0adc1e84614196aae79f4' \
--header 'myapp-api-key: 90B649F2-70F2-4180-95BC-951F5D832F0D' \
--header 'content-type: application/json' \
--data '{
"orderId": "abc-123",
"state": "update",
"updates": [
{ "action": "remove", "item": "widgets", "quantity": 5 },
{ "action": "add", "item": "gadgets", "quantity": 20 }
]
}'
> POST / HTTP/2
> Host: example.com
> user-agent: curl/7.79.1
> accept: */*
> myapp-hmac-sha1: f237e4a4062590a674b0adc1e84614196aae79f4
> myapp-api-key: 90B649F2-70F2-4180-95BC-951F5D832F0D
> content-type: application/json
> content-length: 188
>
* We are completely uploaded and fine
< HTTP/2 200
< accept-ranges: bytes
< cache-control: max-age=604800
< content-type: text/html; charset=UTF-8
< date: Thu, 02 Jun 2022 20:26:44 GMT
< etag: "3147526947"
< expires: Thu, 09 Jun 2022 20:26:44 GMT
< last-modified: Thu, 17 Oct 2019 07:18:26 GMT
< server: EOS (vny/044E)
< content-length: 1256
检查起始行
每个起始行包括以下内容。
- 方法
- URL
- 版本
方法
请求方法(动词)定义了一个HTTP请求所执行的动作。目前,HTTP支持八种方法。
- DELETE
- GET
- HEAD
- OPTIONS
- PATCH
- POST
- PUT
- 追踪
然而,webhooks只使用其中的一个子集。POST在大多数时候都被使用,即使是在数据被更新或删除而不是被创建的时候。偶尔,我们可能会看到一个webhook使用GET来验证一个webhook端点是否存在。不太常见的是,PUT和PATCH被用来修改/替换数据。可能最不常见的是,一些webhooks使用DELETE。
URL
一个webhook 最常见的URL是类似https://example.com/my-webhook 。
一些应用程序在URL上附加一个绝对路径,让你知道被请求的记录类型:例如,当一个订单被确认时,https://example.com/my-webhook/order-confirmation 。
带有查询字符串的URL是网页请求(如搜索引擎)的一种普遍模式,其中一些值被附加到标准URL的末端https://example.com/my-webhook?param1=Param-Value1¶m2=Param-Value2 。虽然不经常出现,但一些应用程序使用查询字符串来通过URL而不是在自定义头文件中发送元数据。
版本
版本就是这样,用于请求的HTTP协议的版本。它通常是HTTP/1.1 或HTTP/2 。虽然webhook HTTP请求包括版本,但它通常没有影响,只是为了确保HTTP请求的有效性。
检查头信息
webhook HTTP请求的头信息可以是默认(标准)头信息或自定义头信息。
默认头信息
许多头信息是默认的,是由源系统自动生成的。下面是几个常用于webhooks的默认头信息。
Content-Type:描述了在正文中发送的数据(例如:application/json)User-Agent:描述了用于请求的HTTP客户端(例如:Mozilla/5.0)。Content-Length:定义了请求的大小,单位是字节。Accept或 。定义了预期的响应类型。Accept-Encoding
自定义标头
webhook HTTP请求的自定义头可以有很大的不同,但经常被用来签署正文,发送一些其他类型的认证(如API密钥),或发送其他数据(如Customer-ID ),不管是什么原因,没有进入请求的正文。自定义头也可用于HMAC签名,以确保webhook端点的安全。
下面是一个webhook HTTP请求的几个自定义头的例子。
myapp-hmac-sha1: f237e4a4062590a674b0adc1e84614196aae79f4
myapp-api-key: 90B649F2-70F2-4180-95BC-951F5D832F0D
检查正文
webhook HTTP请求的主体包含通过POST(大多数情况下)或有时PUT或PATCH发送的数据。
这些数据通常是JSON格式,但也可以是XML、CSV、PDF或任何其他你想使用的格式。如果你需要一次发送几种类型的数据,你可以把主体设置为多部分主体。这样做可以使PDF或MP3等文件通过HTTP请求与JSON等一起传输。请注意,一个多部分主体需要一个相应的多部分Content-Type 头。
下面是一个简单主体的例子。
{"renderId":51266,"s3Bucket":"test-customer-renders","status":"complete"}
下面是一个多部分体的例子(有多部分头)。
curl 'https://example.io/webhook/' \
--request POST \
--header "Content-Type: multipart/form-data" \
--form person='{"firstname":"Sam","lastname":"McElhaney"};type=application/json' \
--form photo=@sam.jpeg \
--form resume=@resume.pdf
> POST /webhook HTTP/2
> Host: example.com
> user-agent: curl/7.79.1
> accept: */*
> content-length: 73686
> content-type: multipart/form-data; boundary=------------------------0c985f7380ec6342
--------------------------0c985f7380ec6342
Content-Disposition: form-data; name="person"
Content-Type: application/json
{"firstname":"Sam","lastname":"McElhaney"}
--------------------------0c985f7380ec6342
Content-Disposition: form-data; name="photo"; filename="sam.jpeg"
Content-Type: image/jpeg
SOME BINARY DATA...
--------------------------0c985f7380ec6342
Content-Disposition: form-data; name="resume"; filename="resume.pdf"
Content-Type: application/pdf
%PDF-1.3
MORE BINARY DATA
%%EOF
--------------------------0c985f7380ec6342--
随着越来越多的公司(从Salesforce到Shopify)实施Webhooks,这项技术正迅速成为SaaS集成的标准。Webhooks很容易理解和实现,而且它们非常灵活--允许你根据数据的需要使它们变得简单或复杂。
Webhook 请求
经Bru Woodring许可发表于DZone。点击这里查看原文。
DZone贡献者所表达的观点属于他们自己。