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

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

完整示例可参照下面这篇文章:

  • 快速构建高并发微服务

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

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

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

type (createOrderReq struct {token     string `path:"token"`     // 用户tokenproductId string `json:"productId"` // 商品IDnum       int    `json:"num"`       // 商品数量}createOrderRes struct {success bool `json:"success"` // 是否成功}findOrderReq struct {token    string `path:"token"`    // 用户tokenpage     int    `form:"page"`     // 页数pageSize int8   `form:"pageSize"` // 页大小}findOrderRes struct {orderInfo []orderInfo `json:"orderInfo"` // 商品ID}orderInfo struct {productId   string `json:"productId"`   // 商品IDproductName string `json:"productName"` // 商品名称num         int    `json:"num"`         // 商品数量}deleteOrderReq struct {id string `path:"id"`}deleteOrderRes struct {success bool `json:"success"` // 是否成功}
)service order {@doc(summary: 创建订单)@handler CreateOrderHandlerpost /order/add/:token(createOrderReq) returns(createOrderRes)@doc(summary: 获取订单)@handler FindOrderHandlerget /order/find/:token(findOrderReq) returns(findOrderRes)@doc(summary: 删除订单)@handler: DeleteOrderHandlerdelete /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 CreateUserHandlerpost /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

好未来技术

如何高效定义和验证restful请求的参数相关推荐

  1. 基于shiro的改造集成真正支持restful请求

    基于shiro的改造集成真正支持restful请求 这个模块分离至项目[api权限管理系统与前后端分离实践]api权限管理系统与前后端分离实践,感觉那样太长了找不到重点,分离出来要好点. 首先说明设计 ...

  2. springMVC获取异步请求的参数,返回异步请求数据(json),跨域访问简单了解,文件上传,与Restful风格

    springMVC获取异步请求的参数 JQuery发送异步请求回顾 <a href="javascript:void(0);" id="testAjax" ...

  3. bootstrapvalidator已定义的验证规则

    bootstrapvalidator已定义的验证规则 说明 查找bootstrapValidator的选项options 查找bootstrapValidator的已验证规则 常用规则 说明 这里使用 ...

  4. 禁止(403)CSRF验证失败请求中止即使使用{%csrf_token%}

    如何解决禁止(403)CSRF验证失败请求中止即使使用{%csrf_token%}? 要使csrf保护起作用,需要做一些事情(请查看docs): 你的浏览器必须接受服务器中的Cookie 确保已将' ...

  5. CSRF验证失败请求中止在Django上

    如何解决CSRF验证失败请求中止在Django上? 你需要将{% csrf_token %}模板标记添加为formDjango模板中元素的子代. 这样,模板将呈现一个隐藏元素,其值设置为CSRF令牌. ...

  6. python_django(禁止访问 (403) CSRF验证失败. 请求被中断)

    禁止访问 403 错误 原因 解决方法: 错误 Forbidden (403) CSRF verification failed. Request aborted.禁止访问 (403) CSRF验证失 ...

  7. python_django_禁止访问 _CSRF验证失败. 请求被中断_更多信息请设置选项DEBUG=True。

    问题描述: 访问一个url时,回有一个注册页面的响应,输入对应的信息后,单击注册按钮进行提交进行页面跳转,显示禁止访问 _CSRF验证失败. 请求被中断_更多信息请设置选项DEBUG=True. 解决 ...

  8. Django CSRF验证失败. 请求被中断.

    项目场景: Python版本:3.7 Django版本:3.1.7 问题描述: 出现了CSRF验证失败. 请求被中断. 原因分析:   在Django中有个设定,防止跨域来请求.比如有爬虫,爬虫不是从 ...

  9. CSRF验证失败. 请求被中断.

    CSRF验证失败. 请求被中断. 当出现这个bug的时候 一般情况下是使用<form>并用post传递的原因 只需要在<form>标签下一行加上{% csrf_token %} ...

最新文章

  1. 安装View Agent失败: The system must be rebooted before installation can continue
  2. 中科元素精准饮食 功能性农业-李喜贵:电视荧屏广州地铁线展示
  3. layui 金额数据千分位_IG神秘打野韩服数据,盲僧数据或暗示英雄池问题
  4. DHCP服务器 出现的故障
  5. Linux 系统下显示文件内容(查看文件内容)的命令 more/less/cat/head/tail 比较
  6. 更新10_linux,时隔十年,QQ更新了Linux版本
  7. 一个被认可的数据治理框架,到底应该什么样?
  8. git 常用命令思维导图
  9. 暴力/图论 hihoCoder 1179 永恒游戏
  10. 23种设计模式(七)对象创建之工厂方法
  11. mysql 抓包工具_好用的MySQL抓包工具:sniffer-agent
  12. 读《看见》第一章观后有感
  13. 信息收集(OSINT)解释与实践-初
  14. 健美运动员赛前脱水断碳_健美运动员在备赛期状态真的很差吗?
  15. 前端UI设计稿对比工具
  16. BIOS实战之Super IO-Smart Fan
  17. 第十一章 枚举与泛型 总结
  18. Leetcode 2110. Number of Smooth Descent Periods of a Stock [Python]
  19. 登出系统gif图标_来了!深度操作系统 20正式版——崭新视界,创无止境
  20. 云架构Linux运维,【Linux云计算架构:第三阶段-Linux高级运维...

热门文章

  1. 冷链物流计算机控制技术,芜湖WCS仓库控制系统
  2. 程序员如何抉择银行技术岗?
  3. 量子通信技术和量子计算机,我国的量子通信技术,走在世界前沿,但是量子计算机还需加把劲!...
  4. 比尔·盖茨离婚内幕被曝光:长期出轨微软女下属 ;传记作者:他不是“技术宅”,好色在业内是公开的秘密!...
  5. 2021年热门的10个IT技术职位以及如何招聘
  6. springboot中使用freemarker根据flt模板导出word、pdf文档
  7. 优学院电子商务理论与实务试题及答案
  8. HTML5span中加入超链接,HTML中文本标签,超链接标签以及图像标签的简单介绍
  9. gerrit git 邮箱不匹配的问题
  10. java arraylist 复制_如何克隆ArrayList和复制其内容?