如何高效定義和驗證restful請求的引數
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
2. http api返回體的序列化
使用官方預設的encoding/json包序列化,在此不再累贅。
3. 配置檔案的反序列化
配置檔案的反序列化和http api請求體的反序列化使用同一套解析規則,可參照http api請求體的反序列化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2728447/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- GOLANG Web請求引數驗證GolangWeb
- RESTFUL風格的URL請求及引數接收REST
- fastapi 請求引數 校驗ASTAPI
- C# .net framework .net core 3.1 請求引數校驗, DataAnnotations, 自定義引數校驗C#Framework
- ajax中POST請求與引數(請求體)設定
- 有趣的請求引數/請求頭
- 引數的定義和引數的傳遞
- ajax中設定請求頭和自定義請求頭
- Laravel 自定義表單請求驗證忽略某些欄位驗證Laravel
- postman 請求引數和 Spring Boot Controller 接受引數PostmanSpring BootController
- 使用Hibernate-Validator優雅的驗證RESTful Web Services的引數RESTWeb
- 請求引數的傳遞
- webapi 設定swagger上請求引數的預設值WebAPISwagger
- Postman傳送請求引數是Map格式的請求Postman
- Springboot請求引數解密Spring Boot解密
- SpringMVC請求引數解析SpringMVC
- GET請求的引數丟失
- 使用 Laravel 請求類來驗證表單請求Laravel
- springmvc引數設定預設值,多地址請求SpringMVC
- 模型的列表定義中,使用函式時如何定義引數?模型函式
- Charles 修改請求(Request)引數
- 使用 gorilla/mux 進行 HTTP 請求路由和驗證GoUXHTTP路由
- 請問在一個介面內怎麼根據請求方式對引數進行分別驗證呢?
- 封裝axios請求並對提交引數進行校驗封裝iOS
- 基礎設施建設——全域性請求引數校驗
- Laravel 檔案上傳和獲取請求引數Laravel
- 關於在request請求時,處理請求引數的問題
- python+pytest介面自動化(6)-請求引數格式的確定Python
- 如何在Spring Boot中驗證JSON請求內容? - SeunSpring BootJSON
- 拙見--springMVC的controller接受的請求引數SpringMVCController
- 加了強型別如何將請求引數轉為整型型別
- jmeter 如何在請求之前修改 post body 裡面的引數的值JMeter
- 使用 PHP 的 Filter 函式(過濾器)高效、安全地獲取請求引數PHPFilter函式過濾器
- Nginx配置和Linux核心引數的學習與驗證NginxLinux
- 尋找寫程式碼感覺(七)之封裝請求引數和返回引數封裝
- Mybatis foreach 請求引數是物件集合MyBatis物件
- 表單請求獲取路由引數路由
- charles 打斷點修改請求引數斷點