如何高效定義和驗證restful請求的參數

go-zero針對文本的序列化和反序列化主要在三個地方使用git

  • http api請求體的反序列化
  • http api返回體的序列化
  • 配置文件的反序列化

完整示例可參照下面這篇文章:github

1. http api請求體的反序列化

在反序列化的過程當中的針對請求數據的數據格式以及數據校驗需求,go-zero實現了本身的一套反序列化機制json

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有三種:api

  • path:http url 路徑中參數反序列化併發

    • /order/add/1234567會解析出來token爲1234567
  • form:http form表單反序列化,須要 header頭添加 Content-Type: multipart/form-dataapp

    • /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:必填,取值爲malefemale
  • avatar:選填,默認爲default.png

更多詳情參見unmarshaler_test.gopost

2. http api返回體的序列化

  • 使用官方默認的encoding/json包序列化,在此再也不累贅

3. 配置文件的反序列化

  • 配置文件的反序列化http api請求體的反序列化使用同一套解析規則,可參照http api請求體的反序列化

4. 項目地址

https://github.com/tal-tech/go-zerourl

好將來技術

相關文章
相關標籤/搜索