文本序列化和反序列化

go-zero针对文本的序列化和反序列化主要在三个地方使用

  • http api请求体的反序列化
  • http api返回体的序列化
  • 配置文件的反序列化

本文假定读者已经定义过api文件以及修改过配置文件,如不熟悉,可参照

1. http api请求体的反序列化

在反序列化的过程中的针对请求数据的数据格式以及数据校验需求,go-zero实现了自己的一套反序列化机制

1.1 数据格式以订单order.api文件为例

  1. type (
  2. createOrderReq struct {
  3. token string `path:"token"` // 用户token
  4. productId string `json:"productId"` // 商品ID
  5. num int `json:"num"` // 商品数量
  6. }
  7. createOrderRes struct {
  8. success bool `json:"success"` // 是否成功
  9. }
  10. findOrderReq struct {
  11. token string `path:"token"` // 用户token
  12. page int `form:"page"` // 页数
  13. pageSize int8 `form:"pageSize"` // 页大小
  14. }
  15. findOrderRes struct {
  16. orderInfo []orderInfo `json:"orderInfo"` // 商品ID
  17. }
  18. orderInfo struct {
  19. productId string `json:"productId"` // 商品ID
  20. productName string `json:"productName"` // 商品名称
  21. num int `json:"num"` // 商品数量
  22. }
  23. deleteOrderReq struct {
  24. id string `path:"id"`
  25. }
  26. deleteOrderRes struct {
  27. success bool `json:"success"` // 是否成功
  28. }
  29. )
  30. service order {
  31. @doc(
  32. summary: 创建订单
  33. )
  34. @handler CreateOrderHandler
  35. post /order/add/:token(createOrderReq) returns(createOrderRes)
  36. @doc(
  37. summary: 获取订单
  38. )
  39. @handler FindOrderHandler
  40. get /order/find/:token(findOrderReq) returns(findOrderRes)
  41. @doc(
  42. summary: 删除订单
  43. )
  44. @handler: DeleteOrderHandler
  45. delete /order/:id(deleteOrderReq) returns(deleteOrderRes)
  46. }

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文件为例

  1. type (
  2. createUserReq struct {
  3. age int8 `json:"age,default=20,range=(12:100]"` // 年龄
  4. name string `json:"name"` // 名字
  5. alias string `json:"alias,optional"` // 别名
  6. sex string `json:"sex,options=male|female"` // 性别
  7. avatar string `json:"avatar,default=default.png"` // 头像
  8. }
  9. createUserRes struct {
  10. success bool `json:"success"` // 是否成功
  11. }
  12. )
  13. service user {
  14. @doc(
  15. summary: 创建订单
  16. )
  17. @handler CreateUserHandler
  18. post /user/add(createUserReq) returns(createUserRes)
  19. }

数据校验有很多种方式,包括以下但不限:

  • age:默认不输入为20,输入则取值范围为(12:100],前开后闭
  • name:必填,不可为空
  • alias:选填,可为空
  • sex:必填,取值为malefemale
  • avatar:选填,默认为default.png

更多详情参见unmarshaler_test.go

2. http api返回体的序列化

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

3. 配置文件的反序列化

  • 配置文件的反序列化http api请求体的反序列化使用同一套解析规则,可参照http api请求体的反序列化