上一篇我們已經把基礎的程式架構給實現了,那我們今天就來認識要如何實作查詢的方法吧
序列化 是指將內存中的數據結構(如結構體、對象)轉換為可存儲或傳輸的格式(如 JSON、XML、二進制)。在 API 開發中,序列化通常用於將服務器端的數據轉換為 JSON 格式,便於通過 HTTP 回應發送給客戶端。
首先,我們需要在 repositories
包中實現用於查詢單個用戶和所有用戶的方法。
func GetByID(id uint) (*models.User, error) {
var user models.User
result := database.DB.Context.First(&user, id)
if result.Error != nil {
return nil, result.Error
}
return &user, nil
}
database.DB.Context.First(&user, id)
: 使用 GORM 的First
方法根據提供的id
查找第一條匹配的User
記錄,並將結果存入user
變數中。如果找不到記錄,會返回一個錯誤。
func GetAll() ([]models.User, error) {
var users []models.User
result := database.DB.Context.Find(&users)
if result.Error != nil {
return nil, result.Error
}
return users, nil
}
database.DB.Context.Find(&users)
:使用 GORM 的Find
方法查詢資料庫中的所有User
記錄,並將結果存入users
切片中。如果查詢過程中出現錯誤,會返回該錯誤。
接下來,我們將在 handler
包中實現 GetHandle
和 GetAllHandle
這兩個處理函數,這些函數將處理 HTTP 請求,調用相應的 repository
方法,並返回適當的 HTTP 回應。
func GetHandle(context *gin.Context) {
// 從 URL 參數中獲取 ID
idParam := context.Param("id")
id, err := strconv.Atoi(idParam)
if err != nil {
context.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
return
}
// 調用 repository 獲取用戶
user, err := repositories.GetByID(uint(id))
if err != nil {
// 判斷是否為記錄未找到錯誤
if err.Error() == "record not found" {
context.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
} else {
context.JSON(http.StatusInternalServerError, gin.H{"error": "Internal server error"})
}
return
}
// 返回用戶資料
context.JSON(http.StatusOK, user)
}
context.Param("id")
:從 URL 路徑中提取名為id
的路由參數,用於識別特定的用戶。context.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"})
:如果id
轉換失敗,返回400 Bad Request
狀態碼和自定義的錯誤訊息,表示客戶端發送的請求中包含無效的用戶 ID。
那我們的context.JSON
就是用來序列化回應資料,我們將 user 結構體序列化為 JSON,並返回狀態碼。
func GetAllHandle(context *gin.Context) {
// 調用 repository 獲取所有用戶
users, err := repositories.GetAll()
if err != nil {
context.JSON(http.StatusInternalServerError, gin.H{"error": "Internal server error"})
return
}
// 返回用戶列表
context.JSON(http.StatusOK, users)
}
特性 | Param(路由參數) | Query(查詢參數) |
---|---|---|
定義方式 | URL 路徑的一部分,例如 /user/:id |
URL 的查詢部分,例如 /users?page=1 |
用途 | 標識特定資源,如單一用戶 | 傳遞輔助信息,如過濾、排序、分頁等 |
獲取方式 | context.Param("key") | context.Query("key") 或 context.DefaultQuery("key", "default") |
適用場景 | CRUD 操作中的資源標識,如 GET /user/1 |
API 查詢參數,如 GET /users?page=1&limit=10 |
在本篇文章中,我們深入探討了如何在 Gin
框架中實作查詢功能,和我們該如何去檢查我們寫好的 api
,那我們明天再介紹如何實作修改的部分。