关于golang:如何高效定义和验证restful请求的参数

35次阅读

共计 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:必填,取值为 malefemale
  • avatar:选填,默认为default.png

更多详情参见 unmarshaler_test.go

2. http api 返回体的序列化

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

3. 配置文件的反序列化

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

4. 我的项目地址

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

好将来技术

正文完
 0