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

千鋒Python唐小強發表於2020-10-21

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

  • http api請求體的反序列化
  • http api返回體的序列化
  • 配置檔案的反序列化
如何高效定義和驗證restful請求的引數

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


2. http api返回體的序列化

使用官方預設的encoding/json包序列化,在此不再累贅。


3. 配置檔案的反序列化

配置檔案的反序列化和http api請求體的反序列化使用同一套解析規則,可參照http api請求體的反序列化。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2728447/,如需轉載,請註明出處,否則將追究法律責任。

相關文章