如何高效定義和驗證restful請求的參數
- 2020 年 10 月 20 日
- 筆記
go-zero針對文本的序列化和反序列化主要在三個地方使用
- http api請求體的反序列化
- http api返回體的序列化
- 配置文件的反序列化
完整示例可參照下面這篇文章:
1. http api請求體的反序列化
在反序列化的過程中的針對請求數據的數據格式
以及數據校驗
需求,go-zero實現了自己的一套反序列化機制
1.1 數據格式
以訂單order.api文件為例
type (
createOrderReq struct {
token string `path:"token"` // 用戶token
productId string `json:"productId"` // 商品ID
num int `json:"num"` // 商品數量
}
createOrderRes struct {
success bool `json:"success"` // 是否成功
}
findOrderReq struct {
token string `path:"token"` // 用戶token
page int `form:"page"` // 頁數
pageSize int8 `form:"pageSize"` // 頁大小
}
findOrderRes struct {
orderInfo []orderInfo `json:"orderInfo"` // 商品ID
}
orderInfo struct {
productId string `json:"productId"` // 商品ID
productName string `json:"productName"` // 商品名稱
num int `json:"num"` // 商品數量
}
deleteOrderReq struct {
id string `path:"id"`
}
deleteOrderRes struct {
success bool `json:"success"` // 是否成功
}
)
service order {
@doc(
summary: 創建訂單
)
@handler CreateOrderHandler
post /order/add/:token(createOrderReq) returns(createOrderRes)
@doc(
summary: 獲取訂單
)
@handler FindOrderHandler
get /order/find/:token(findOrderReq) returns(findOrderRes)
@doc(
summary: 刪除訂單
)
@handler: DeleteOrderHandler
delete /order/:id(deleteOrderReq) returns(deleteOrderRes)
}
http api請求體的反序列化的tag有三種:
-
path
:http url 路徑中參數反序列化/order/add/1234567
會解析出來token為1234567
-
form
:http form表單反序列化,需要 header頭添加 Content-Type: multipart/form-data/order/find/1234567?page=1&pageSize=20
會解析出來token為1234567,page為1,pageSize為20
-
json
:http request json body反序列化,需要 header頭添加 Content-Type: application/json{"productId":"321","num":1}
會解析出來productId為321,num為1
1.2 數據校驗
以用戶user.api文件為例
type (
createUserReq struct {
age int8 `json:"age,default=20,range=(12:100]"` // 年齡
name string `json:"name"` // 名字
alias string `json:"alias,optional"` // 別名
sex string `json:"sex,options=male|female"` // 性別
avatar string `json:"avatar,default=default.png"` // 頭像
}
createUserRes struct {
success bool `json:"success"` // 是否成功
}
)
service user {
@doc(
summary: 創建訂單
)
@handler CreateUserHandler
post /user/add(createUserReq) returns(createUserRes)
}
數據校驗有很多種方式,包括以下但不限:
age
:默認不輸入為20,輸入則取值範圍為(12:100],前開後閉name
:必填,不可為空alias
:選填,可為空sex
:必填,取值為male
或female
avatar
:選填,默認為default.png
更多詳情參見unmarshaler_test.go
2. http api返回體的序列化
- 使用官方默認的
encoding/json
包序列化,在此不再累贅
3. 配置文件的反序列化
配置文件的反序列化
和http api請求體的反序列化
使用同一套解析規則,可參照http api請求體的反序列化
4. 項目地址
好未來技術