0%

用 Go 寫 Web API?Gin Framework 帶你快速上手!

大家好,我是一個在剛開始學習 Golang 的工程師,今天想和大家聊聊 Gin Framework ——一個簡單又強大的 Go 語言 Web Framework。如果你聽過 Golang,一定知道它以高效能和簡潔聞名,而 Gin 就像你常用的悠遊卡,小巧方便,卻能輕鬆應付各種場景。接下來,讓我們從零開始認識 Gin。

什麼是 Gin Framework?

想像你在開一家咖啡店,顧客進門點單,你得快速把咖啡端上桌。Gin 就像是你店裡的咖啡機:它不負責種咖啡豆(那是資料庫的事),也不負責裝潢店面(那是前端的事),但它能幫你快速接收訂單(HTTP 請求)、處理需求(路由與邏輯),然後端出成品(回應)。簡單來說,Gin 是一個輕量級的 Web Framework,專注於處理 HTTP request 和 Routing,特別適合用來打造 API 或簡單的網站。

相比其他框架,如 Flask 或 Express,Gin 的優勢在於速度快和語法簡潔。Flask 簡單易上手但效能需額外優化,Express 靈活且生態豐富卻受單執行緒限制。而 Gin 就像一台『迷你跑車』,輕巧高效,讓你在 Web 開發中跑得又快又穩。

安裝與第一個「Hello, World!」

在開始之前,假設你已經安裝了 Go(可以用 go version 檢查)。接著,我們需要把 Gin 安裝到你的工具箱裡。

Step 1: 安裝 Gin

打開終端機,輸入以下指令,就像去超市買食材一樣:

1
go get -u github.com/gin-gonic/gin

這會下載 Gin 的最新版本並加入你的 Go 專案。

Step 2: 寫一個簡單的 Web 服務

新建一個檔案叫做 main.go,就像準備開始煮咖啡一樣,我們先把基本架構搭起來:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "github.com/gin-gonic/gin"

func main() {
// 建立一個新的 Gin 引擎,就像開啟一台咖啡機
r := gin.Default()

// 定義一個路由:當有人訪問 "/" 時,回應 "Hello, World!"
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello, World!")
})

// 啟動服務,預設跑在 8080 埠
r.Run()
}

Step 3: 啟動服務

在終端機輸入:

1
go run main.go

打開瀏覽器,輸入 http://localhost:8080,你會看到「Hello, World!」跳出來。這就像你第一次試著泡咖啡——簡單幾步,卻已經能端出一杯讓人滿足的飲品。

Gin 的核心概念

Gin 的運作有三個關鍵:

  1. **引擎 (Engine)**:gin.Default() 是你的料理機開關,負責啟動服務和分配訂單。
  2. **路由 (Routing)**:根據顧客的點單(URL),決定端出什麼咖啡(回應)。
  3. **上下文 (Context)**:gin.Context 就像訂單小票,記下顧客需求並告訴你怎麼回應。

Gin 路由解析:如何處理請求

在 Gin 裡,路由(Routing)就像是咖啡店的點單流程。比如:

  • 顧客說「我要拿鐵」 → 你把訂單送到 /latte 這條路線。
  • 顧客說「我要查帳單」 → 你把訂單送到 /bill 這條路線。

我們來加幾個路由看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "github.com/gin-gonic/gin"

func main() {
r := gin.Default()

// 根路由:歡迎顧客
r.GET "/", func(c *gin.Context) {
c.String(200, "歡迎來到我的咖啡店!")
})

// 拿鐵訂單
r.GET("/latte", func(c *gin.Context) {
c.String(200, "這是一杯熱拿鐵,享用吧!")
})

// 查詢帳單
r.GET("/bill", func(c *gin.Context) {
c.String(200, "今天的帳單是 50 元。")
})

r.Run()
}

現在訪問 http://localhost:8080/latte,你會看到拿鐵的回應;訪問 http://localhost:8080/bill,則會看到帳單。這就是路由的基本概念:根據顧客的需求(URL),提供不同的服務(回應)。

處理顧客的特殊需求:參數與 JSON

假設有個顧客說:「我要一杯拿鐵,但大小要中杯,糖要少一點。」這時候,單純的 /latte 不夠用了,我們需要從 URL 或請求中提取參數。

用 URL 參數

改進程式碼,讓顧客可以指定杯子大小:

1
2
3
4
r.GET("/latte/:size", func(c *gin.Context) {
size := c.Param("size") // 從 URL 中提取 "size" 參數
c.String(200, "這是一杯 %s 拿鐵,享用吧!", size)
})

訪問 http://localhost:8080/latte/medium,你會看到「這是一杯 medium 拿鐵,享用吧!」。

用 JSON 處理更複雜的訂單

如果顧客的需求更詳細(例如糖量、溫度),可以用 POST 請求傳 JSON:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
r.POST("/order", func(c *gin.Context) {
type CoffeeOrder struct {
Type string `json:"type"`
Size string `json:"size"`
Sugar int `json:"sugar"`
}

var order CoffeeOrder
if err := c.BindJSON(&order); err != nil {
c.String(400, "訂單格式錯誤!")
return
}

c.JSON(200, gin.H{
"message": "訂單收到!",
"order": order,
})
})

用工具(例如 Postman)發送以下 POST 請求到 http://localhost:8080/order

1
2
3
4
5
{
"type": "latte",
"size": "large",
"sugar": 2
}

你會得到回應:

1
2
3
4
5
6
7
8
{
"message": "訂單收到!",
"order": {
"type": "latte",
"size": "large",
"sugar": 2
}
}

這就像顧客填好訂單表,你確認後回覆一樣,簡單又清楚。

讓我們總結一下:Gin 的魅力

Gin 的設計哲學就像咖啡店的經營之道:簡單、快速、靈活。它不強迫你用複雜的設定,而是提供直觀的工具,讓你專注在業務邏輯上。透過今天的例子,我們學會了:

  1. 如何安裝和啟動 Gin。
  2. 用路由處理不同的請求。
  3. 接收參數和 JSON,提升服務的彈性。

下次如果你想打造一個輕量級 API(例如給手機 App 用的後端)、Web 應用程式,甚至是微服務架構,不妨試試 Gin,它能助你一臂之力。