HTTP 消息是两个系统(通常是服务器和客户端)交换数据的常用方法。我们通常将每个 HTTP 消息称为 HTTP 请求或 HTTP 响应。
Webhook HTTP 请求是 HTTP 请求的一个特定子集,HTTP 请求基于系统中的事件在系统之间传输数据。Webhook 用于许多事件驱动的集成。
当与我们的客户一起工作时,我们发现有些人对 webhook 是新手,并且希望更多地了解 webhook HTTP 请求的组成部分。如果你属于这一类,这篇文章应该会有所帮助。
Webhook HTTP 请求通常包括以下内容:
Start line. 每个请求都有一个起始行。它出现在请求的开头,包括方法、 URL 和版本。下面是一个起始行的例子:
POST /webhook/E474BA38/58E1/4544 HTTP/2
Header(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: 188Body (payload). 每个请求(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每条Start Line包括以下内容:
请求方法(动词)定义由 HTTP 请求执行的操作。目前,HTTP 支持八种方法:
但是,webhook 只使用其中的一个子集。POST 在大多数情况下都会被使用,即使是在更新或删除数据而不是创建数据时也是如此。有时,我们可能会看到 webhook 使用 GET 来验证 webhook 端点是否存在。不太常见的是,PUT 和 PATCH 用于修改/替换数据。可能最不常见的是,一些 webhook 使用 DELETE。
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 请求的头可以是默认(标准)头或自定义头。
许多头是默认的,并且是由源系统自动生成的。下面是一些常用于 webhook 的默认头:
Webhook HTTP 请求的自定义头可能有很大的不同,但是经常用于对主体进行签名,发送其他类型的身份验证(比如 API 密钥) ,或者发送其他数据(比如 Customer-ID) ,不管出于什么原因,这些数据没有进入请求的主体。自定义头也可用于 HMAC 签名,以保护 webhook 端点。
下面是一对 webhook HTTP 请求的自定义头的例子:
myapp-hmac-sha1: f237e4a4062590a674b0adc1e84614196aae79f4
myapp-api-key: 90B649F2-70F2-4180-95BC-951F5D832F0DWebhook HTTP 请求的主体包含通过 POST (在大多数情况下)或有时通过 PUT 或 PATCH 发送的数据。
这些数据通常是 JSON 格式,但也可以是 XML、 CSV、 PDF 或任何其他您想要使用的格式。如果需要同时发送多种类型的数据,可以将主体设置为多部分主体。这样做允许通过 HTTP 请求和 JSON 一起传输 PDF 或 MP3等文件。请注意,多部分主体需要相应的多部分 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)实现 webhook,这种技术正迅速成为 SaaS 集成的标准。Webhook 易于理解和实现,并且非常灵活——允许您根据数据需要将它们变得简单或复杂。
本人抖音账号:里面有最新最流行的automation devops等技术的系列视频介绍,欢迎大家留言点赞。
| 留言与评论(共有 0 条评论) “” |