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

好未来技术

如何高效定义和验证restful请求的参数的更多相关文章

  1. 技术分享 | 一步一步学测试平台开发-Vue restful请求

    本文节选自霍格沃兹测试学院内部教材 一般在构建应用时需要访问后端的 API 接口获取后端数据并展示.做这件事的方法有很多种(比如 axios,vue-resource,fetch-jsonp),使用 ...

  2. jhipster生成项目无法使用restful请求,报access_denied 403错误

    写在前边: 我们的微服务是注册中心.uaa.gateway为基础,添加微服务应用,昨天下午在测试jhipster的增删改查,因为jhipster生成的代码都是restful的,好不容易找到网关配置的映 ...

  3. Spring-cloud(五) 使用Ribbon进行Restful请求

    写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵. 主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意 ...

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

    当页面中form使用POST方式向后台提交时,报如下错误: 禁止访问 (403) CSRF验证失败. 请求被中断. Help Reason given for failure: ​ CSRF toke ...

  5. jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器

    1.简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如 ...

  6. Post请求data参数构造及巧用js脚本显示爬虫进度

    小爬最近随着对python中字符串.json等理解进一步加深,发现先前我随笔中提到的data构造和传参方法略复杂,原本有更简单的方法,Mark如下. 先前小爬我使用的requests.post请求中d ...

  7. JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器

    有这样一个压力测试环境,有一个上传页面,上传成功之后服务器会返回一些上传信息(比如文件的 id 或者保存路径之类的信息),然后压力机会继续下一个请求,比如调整 id 为 xx 的文件的一些信息等等.问 ...

  8. 【转】jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器

    1.简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如 ...

  9. 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

随机推荐

  1. Mysql 多表连查 xml写法 非注解形式

    1.xml写法 <!-- 联查用户users表 --> <resultMap type="nanh.entity.Tasks" id="selectTa ...

  2. openstack (共享服务) 消息队列rabbitmq服务

    云计算openstack共享组件——消息队列rabbitmq(3)   一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队 ...

  3. (专题一)01 matlab基础

    功能区:主页,绘图,应用程序 当前文件夹工具栏 命令行窗口:输入命令,按下回车键,会在后面显示执行后的命令 如果命令行很长可以分两行来写,用“...”做续行符 建立当前文件夹:可以用cd命令 例如在d ...

  4. vue 项目中实时请求接口 建立长连接

    需求:在项目中需要每隔五秒请求一次接口 第一种方法:直接在mounted钩子函数中处理 mounted() { window.setInterval(() => { setTimeout(thi ...

  5. Oracle学习(十七)数据库锁在分布式系统里的应用(老板,乐观锁了解一下?~)

    一.引言 随着业务量的增加,单机部署已经无法满足日常需求了,我们可能会把代码部署到多台服务器上去来进行服务的扩容,也就是负载均衡,那在这种场景下,怎么能实现锁的概念呢? 那么我们知道如果是一台主机部署 ...

  6. hystrix 源码分析以及属性的配置

    一.feign与hystix结合 1.1测试环境搭建 架构如图: 非常简单,就是Order服务通过feign调用product服务的一个获取商品信息的一个接口: package com.yang.xi ...

  7. oracle中插入一条记录后,重新登录查找不到数据

    你插入了数据,但是没有提交.其他Session也就是你再次登录后自然就看不到了(但是在当前回话可以看到插入的数据),但是你用SQLPLUS EXIT之后再次登录就可以看到插入的数据了,因为ORACLE ...

  8. Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏

    内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了

  9. CUMTCTF'2020 未完成 wp

    Web babysqli burp抓包,发现有 的过滤,用/**/过滤空格. 报错注入 payload username=admin&password='/**/or/**/extractva ...

  10. Spring Cloud系列(三):Eureka源码解析之服务端

    一.自动装配 1.根据自动装配原理(详见:Spring Boot系列(二):Spring Boot自动装配原理解析),找到spring-cloud-starter-netflix-eureka-ser ...