API 教學

本教學將向你展示如何使用 Caddy 的 admin API,這使得以程式化方式實現自動化成為可能。

目標:

  • 🔲 執行 daemon
  • 🔲 為 Caddy 提供 config
  • 🔲 測試 config
  • 🔲 替換啟動中的 config
  • 🔲 遍歷 config
  • 🔲 使用 @id 標籤

必備條件:

  • 基礎的終端機 / 命令列技能
  • 基礎的 JSON 經驗
  • 你的 PATH 中有 caddycurl

要啟動 Caddy daemon,請使用 run 子指令:

caddy run

這會永久阻塞,但它在做什麼呢?目前... 什麼都沒做。預設情況下,Caddy 的配置("config")是空白的。我們可以在另一個終端機中使用 admin API 來驗證這一點:

curl localhost:2019/config/

我們可以透過給予 Caddy 一個 config 來使其發揮作用。其中一種方法是向 /load 端點發送 POST 請求。就像任何 HTTP 請求一樣,有很多方法可以做到這一點,但在本教學中我們將使用 curl

你的第一個 config

為了準備我們的請求,我們需要建立一個 config。Caddy 的配置只是一個 JSON 文件(或 任何可以轉換為 JSON 的東西)。

將此內容儲存到 JSON 檔案中:

{
	"apps": {
		"http": {
			"servers": {
				"example": {
					"listen": [":2015"],
					"routes": [
						{
							"handle": [{
								"handler": "static_response",
								"body": "Hello, world!"
							}]
						}
					]
				}
			}
		}
	}
}

然後上傳它:

curl localhost:2019/load \
	-H "Content-Type: application/json" \
	-d @caddy.json

我們可以用另一個 GET 請求來驗證 Caddy 是否套用了我們的新 config:

curl localhost:2019/config/

在瀏覽器中前往 localhost:2015 或使用 curl 來測試它是否正常工作:

curl localhost:2015
Hello, world!

如果你看到 Hello, world!,那麼恭喜你 —— 它正在工作!確保你的 config 按預期工作總是一個好主意,特別是在部署到生產環境之前。

讓我們將歡迎訊息從 "Hello world!" 更改為更具激勵性的內容:"I can do hard things." 在你的 config 檔案中進行此更改,使 handler 物件現在看起來像這樣:

{
	"handler": "static_response",
	"body": "I can do hard things."
}

儲存 config 檔案,然後再次執行相同的 POST 請求來更新 Caddy 的啟動配置:

curl localhost:2019/load \
	-H "Content-Type: application/json" \
	-d @caddy.json

為了慎重起見,請驗證 config 已更新:

curl localhost:2019/config/

透過重新整理瀏覽器頁面(或再次執行 curl)來測試它,你將看到一條勵志訊息!

Config 遍歷

我們可以使用 Caddy API 的強大功能來進行更改,而無需觸及我們的 config 檔案,而不是為了小小的更改而上傳整個 config 檔案。

使用請求 URI 的路徑,我們可以遍歷 config 結構並僅更新訊息字串(如果被裁剪,請務必向右滾動):

curl \
	localhost:2019/config/apps/http/servers/example/routes/0/handle/0/body \
	-H "Content-Type: application/json" \
	-d '"Work smarter, not harder."'

你可以使用類似的 GET 請求來驗證它是否成功,例如:

curl localhost:2019/config/apps/http/servers/example/routes

你應該會看到:

[{"handle":[{"body":"Work smarter, not harder.","handler":"static_response"}]}]

重要提示: 這應該很明顯,但是一旦你使用 API 進行了不在原始 config 檔案中的更改,你的 config 檔案就會變得過時。有幾種方法可以處理這個問題:

  • 使用 caddy run 指令的 --resume 來使用最後一個啟動的 config。
  • 不要混合使用 config 檔案與透過 API 進行的更改;保持單一事實來源。
  • 透過隨後的 GET 請求 匯出 Caddy 的新配置(與前兩個選項相比,不推薦此選項)。

在 JSON 中使用 @id

Config 遍歷當然很有用,但路徑有點長,你不覺得嗎?

我們可以給我們的 handler 物件一個 @id 標籤 來使其更容易存取:

curl \
	localhost:2019/config/apps/http/servers/example/routes/0/handle/0/@id \
	-H "Content-Type: application/json" \
	-d '"msg"'

這會為我們的 handler 物件增加一個屬性:"@id": "msg",所以它現在看起來像這樣:

{
	"@id": "msg",
	"body": "Work smarter, not harder.",
	"handler": "static_response"
}

然後我們可以直接存取它:

curl localhost:2019/id/msg

現在我們可以用更短的路徑來更改訊息:

curl \
	localhost:2019/id/msg/body \
	-H "Content-Type: application/json" \
	-d '"Some shortcuts are good."'

然後再次檢查:

curl localhost:2019/id/msg/body