
如何高效定义和验证restful请求的参数
1.1
1.2
发布日期:2021-05-09 04:09:57
浏览次数:17
分类:博客文章
本文共 2516 字,大约阅读时间需要 8 分钟。
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请求体的反序列化
4. 项目地址
好未来技术
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月14日 17时49分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
并发编程实战-ConcurrentHashMap源码解析
2019-03-06
C#之反射、元数据详解
2019-03-06
通俗易懂设计模式解析——单例模式
2019-03-06
通俗易懂设计模式解析——抽象工厂模式
2019-03-06
SSM商城项目(十二)
2019-03-06
第5章选择结构程序设计
2019-03-06
前端数据渲染及mustache模板引擎的简单实现
2019-03-06
设计模式系列之工厂模式三兄弟(Factory Pattern)
2019-03-06
OAuth2.0认证详解
2019-03-06
如何禁用控制台窗口的关闭按钮?
2019-03-06
Netflix是什么,与Spring Cloud有什么关系
2019-03-06
Java 中初始化 List 集合的 6 种方式!
2019-03-06
别乱提交代码了,看下大厂 Git 提交规范是怎么做的!
2019-03-06
在滴滴和头条干了 2 年后端开发,太真实…
2019-03-06
送给你 12 个 Git 使用技巧!
2019-03-06
使用 Redis 实现一个轻量级的搜索引擎,牛逼!
2019-03-06
你还在用分页?试试 MyBatis 流式查询,真心强大!
2019-03-06
你还在用命令看日志?快用 Kibana 吧,一张图片胜过千万行日志!
2019-03-06
python进阶(3)json文件与python字典的转化
2019-03-06
Linux中对用户操作
2019-03-06