随笔 - 191  文章 - 0  评论 - 312  阅读 - 39万

如何高效定义和验证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:必填,取值为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

好未来技术

posted on   万俊峰Kevin  阅读(1175)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示