Webhook HTTP 请求剖析

Webhook 易于理解和实现,并且非常灵活——允许您根据数据需要将它们变得简单或复杂


HTTP 消息是两个系统(通常是服务器和客户端)交换数据的常用方法。我们通常将每个 HTTP 消息称为 HTTP 请求或 HTTP 响应。

Webhook HTTP 请求是 HTTP 请求的一个特定子集,HTTP 请求基于系统中的事件在系统之间传输数据。Webhook 用于许多事件驱动的集成。

当与我们的客户一起工作时,我们发现有些人对 webhook 是新手,并且希望更多地了解 webhook HTTP 请求的组成部分。如果你属于这一类,这篇文章应该会有所帮助。

Webhook HTTP 请求的部分是什么?

Webhook HTTP 请求通常包括以下内容:

  • Start line
  • Header(s)
  • Body (payload)

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: 188


Body (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

每条Start Line包括以下内容:

  • Method
  • URL
  • Version

Method

请求方法(动词)定义由 HTTP 请求执行的操作。目前,HTTP 支持八种方法:

  • DELETE
  • GET
  • HEAD
  • OPTIONS
  • PATCH
  • POST
  • PUT
  • TRACE

但是,webhook 只使用其中的一个子集。POST 在大多数情况下都会被使用,即使是在更新或删除数据而不是创建数据时也是如此。有时,我们可能会看到 webhook 使用 GET 来验证 webhook 端点是否存在。不太常见的是,PUT 和 PATCH 用于修改/替换数据。可能最不常见的是,一些 webhook 使用 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 发送元数据,而不是使用自定义标题。

Version

版本就是用于请求的 HTTP 协议的版本。它通常是 HTTP/1.1或 HTTP/2。尽管 webhook HTTP 请求包含版本,但它通常没有影响,而是确保 HTTP 请求是有效的。

检查the Headers

Webhook HTTP 请求的头可以是默认(标准)头或自定义头。

默认Headers

许多头是默认的,并且是由源系统自动生成的。下面是一些常用于 webhook 的默认头:

  • Content-Type: (描述正文中发送的数据(例如:application/json)
  • User-Agent: (描述用于请求的 HTTP 客户端(示例:Mozilla/5.0)
  • Content-Length: 以字节为单位定义请求的大小
  • Accept or 或者Accept-Encoding: 定义预期响应的类型

自定义Headers

Webhook HTTP 请求的自定义头可能有很大的不同,但是经常用于对主体进行签名,发送其他类型的身份验证(比如 API 密钥) ,或者发送其他数据(比如 Customer-ID) ,不管出于什么原因,这些数据没有进入请求的主体。自定义头也可用于 HMAC 签名,以保护 webhook 端点。

下面是一对 webhook HTTP 请求的自定义头的例子:

myapp-hmac-sha1: f237e4a4062590a674b0adc1e84614196aae79f4
myapp-api-key: 90B649F2-70F2-4180-95BC-951F5D832F0D


检查Body

Webhook 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等技术的系列视频介绍,欢迎大家留言点赞。

Webhook HTTP 请求剖析

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章