共计 2136 个字符,预计需要花费 6 分钟才能阅读完成。
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. 我的项目地址
https://github.com/tal-tech/go-zero
好将来技术
正文完