上一篇我們已經把基礎的程式架構給實現了,那我們今天就來認識要如何實作查詢的方法吧
序列化 是指將內存中的數據結構(如結構體、對象)轉換為可存儲或傳輸的格式(如 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,那我們明天再介紹如何實作修改的部分。