要設定 Sanity 的 Webhook 要從右上角這邊進入管理頁面:
進入管理頁面後到 API > Webhooks 內設定 Webhook
按 Create webhook 後就可以做設定了:
Trigger on 可以設定哪些行為要觸發 Webhook,可以選 Create
, Update
或 Delete
,也可以一次選三個讓所有對資料的改動都觸發 Webhook
( 免費用戶限定只能創建 2 個 Webhooks,所以可以考慮每個動作都觸發,在程式裡做條件判斷 )
不僅可以設定觸發 Webhook 的變更行為,還可以設定觸發的 HTTP method,可以依據不同的動作有不同的 HTTP 行為,像是:
POST
PUT
DELETE
甚至有些特別需要用到 GET
的話也是可以的。
( 但正如方才提到的,免費用戶只能創建 2 個 Webhooks,所以可能無法針對每個行為特別指定 HTTP method,這要有所取捨了,可能都要在程式邏輯裡做判斷了 )
最後稍微來看一下 Webhook 設定完成後會傳送的 Headers 訊息:
{
"sanity-dataset": "production",
"sanity-document-id": "zxxxxxxxxxxxxxxxxxxb",
"sanity-operation": "update", // <- Sanity 的行為
"sanity-project-id": "zxxxxxxg",
"sanity-transaction-id": "Tpe1Rj6o9fDmGqbWvlbS3A",
"sanity-transaction-time": "2024-10-09T12:55:02Z",
"sanity-webhook-id": "QlyCyyQxxX5Ln1e2",
"sanity-webhook-signature": "t=1728478502590,v1=d8bbJcxxx0wkAddd0Nmq3Su9k6bC4GbBvQILz_-oUYT",
"x-api-key": "API_Value" // <- 自訂的 HTTP header
}
Sanity 傳送過來比較特別的是這些訊息,再特別來看一下 sanity-webhook-signature
{
"sanity-webhook-signature": "t=1728478502590,v1=d8bbJcxxx0wkAddd0Nmq3Su9k6bC4GbBvQILz_-oUYT"
}
這個的結構是 t=12345, v1=d8bbJ…,t
跟 v1
就是在建立 Webhook 時設定的 Secret 經過加密後的值了,如果要驗證的話就是針對這段進行驗證。( 但自己做很難 )
不過不用擔心,Sanity 有提供官方的 toolkit 來做驗證的動作,我們不需要知道背後細節的。