文件
一個 專案

API 教學

本教學將示範如何使用 Caddy 的 管理 API,這讓自動化成為可能,且可程式化。

目標

  • 🔲 執行守護程式
  • 🔲 給 Caddy 一個設定
  • 🔲 測試設定
  • 🔲 取代活動設定
  • 🔲 遍歷設定
  • 🔲 使用 @id 標籤

先備條件

  • 基本的終端機 / 命令列技能
  • 基本的 JSON 經驗
  • 在您的 PATH 中有 caddycurl

要啟動 Caddy 守護程式,請使用 run 子指令

caddy run

這會永遠封鎖,但它在做什麼?目前... 什麼也沒做。預設情況下,Caddy 的設定(「config」)是空白的。我們可以使用另一個終端機中的 管理 API 來驗證這一點

curl localhost:2019/config/

我們可以透過給它一個設定讓 Caddy 變得有用。其中一種方法是對 /load 端點發出 POST 要求。就像任何 HTTP 要求一樣,有許多方法可以做到這一點,但在本教學中,我們將使用 curl

您的第一個設定檔

為準備我們的要求,我們需要建立一個設定檔。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 是否套用我們的新設定檔

curl localhost:2019/config/

透過在瀏覽器中前往 localhost:2015 或使用 curl 測試它是否運作

curl localhost:2015
Hello, world!

如果您看到 Hello, world!,那麼恭喜您,它運作了!在部署到生產環境之前,確保您的設定檔按照您的預期運作永遠是一個好主意。

讓我們將我們的歡迎訊息從「Hello world!」變更為更激勵人心的話:「我可以做困難的事。」在您的設定檔中進行此變更,讓處理常式物件現在看起來像這樣

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

儲存設定檔,然後再次執行相同的 POST 要求來更新 Caddy 的活動設定檔

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

為了安全起見,驗證設定檔是否已更新

curl localhost:2019/config/

透過在瀏覽器中重新整理頁面(或再次執行 curl)來測試它,您將會看到一條鼓舞人心的訊息!

設定檔橫向移動

不要上傳整個設定檔進行小變更,讓我們使用 Caddy API 的強大功能來進行變更,而不用觸及我們的設定檔。

使用要求 URI 的路徑,我們可以橫向移動到設定檔結構中,並只更新訊息字串(如果被剪裁,請務必向右捲動)

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 進行不在原始設定檔中的變更,你的設定檔就會過時。有幾種方法可以處理這個問題

  • 使用 caddy run 命令的 --resume 來使用最後一個活動設定檔。
  • 不要將設定檔的使用與透過 API 的變更混用;有一個真實來源。
  • 使用後續的 GET 要求 匯出 Caddy 的新設定檔(不建議使用,不如前兩個選項)。

在 JSON 中使用 @id

設定檔遍歷當然有用,但路徑有點長,你認為呢?

我們可以給處理常式物件一個 @id 標籤,以方便存取

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

這會在我們的處理常式物件中新增一個屬性:"@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