如何高效定义和验证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:必填,取值为male或femaleavatar:选填,默认为default.png
更多详情参见unmarshaler_test.go
2. http api返回体的序列化
- 使用官方默认的
encoding/json包序列化,在此不再累赘
3. 配置文件的反序列化
配置文件的反序列化和http api请求体的反序列化使用同一套解析规则,可参照http api请求体的反序列化
4. 项目地址
https://github.com/tal-tech/go-zero
好未来技术
如何高效定义和验证restful请求的参数的更多相关文章
- 技术分享 | 一步一步学测试平台开发-Vue restful请求
本文节选自霍格沃兹测试学院内部教材 一般在构建应用时需要访问后端的 API 接口获取后端数据并展示.做这件事的方法有很多种(比如 axios,vue-resource,fetch-jsonp),使用 ...
- jhipster生成项目无法使用restful请求,报access_denied 403错误
写在前边: 我们的微服务是注册中心.uaa.gateway为基础,添加微服务应用,昨天下午在测试jhipster的增删改查,因为jhipster生成的代码都是restful的,好不容易找到网关配置的映 ...
- Spring-cloud(五) 使用Ribbon进行Restful请求
写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵. 主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意 ...
- Django CSRF验证失败. 请求被中断.
当页面中form使用POST方式向后台提交时,报如下错误: 禁止访问 (403) CSRF验证失败. 请求被中断. Help Reason given for failure: CSRF toke ...
- jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器
1.简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如 ...
- Post请求data参数构造及巧用js脚本显示爬虫进度
小爬最近随着对python中字符串.json等理解进一步加深,发现先前我随笔中提到的data构造和传参方法略复杂,原本有更简单的方法,Mark如下. 先前小爬我使用的requests.post请求中d ...
- JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器
有这样一个压力测试环境,有一个上传页面,上传成功之后服务器会返回一些上传信息(比如文件的 id 或者保存路径之类的信息),然后压力机会继续下一个请求,比如调整 id 为 xx 的文件的一些信息等等.问 ...
- 【转】jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器
1.简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如 ...
- 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
随机推荐
- Mysql 多表连查 xml写法 非注解形式
1.xml写法 <!-- 联查用户users表 --> <resultMap type="nanh.entity.Tasks" id="selectTa ...
- openstack (共享服务) 消息队列rabbitmq服务
云计算openstack共享组件——消息队列rabbitmq(3) 一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队 ...
- (专题一)01 matlab基础
功能区:主页,绘图,应用程序 当前文件夹工具栏 命令行窗口:输入命令,按下回车键,会在后面显示执行后的命令 如果命令行很长可以分两行来写,用“...”做续行符 建立当前文件夹:可以用cd命令 例如在d ...
- vue 项目中实时请求接口 建立长连接
需求:在项目中需要每隔五秒请求一次接口 第一种方法:直接在mounted钩子函数中处理 mounted() { window.setInterval(() => { setTimeout(thi ...
- Oracle学习(十七)数据库锁在分布式系统里的应用(老板,乐观锁了解一下?~)
一.引言 随着业务量的增加,单机部署已经无法满足日常需求了,我们可能会把代码部署到多台服务器上去来进行服务的扩容,也就是负载均衡,那在这种场景下,怎么能实现锁的概念呢? 那么我们知道如果是一台主机部署 ...
- hystrix 源码分析以及属性的配置
一.feign与hystix结合 1.1测试环境搭建 架构如图: 非常简单,就是Order服务通过feign调用product服务的一个获取商品信息的一个接口: package com.yang.xi ...
- oracle中插入一条记录后,重新登录查找不到数据
你插入了数据,但是没有提交.其他Session也就是你再次登录后自然就看不到了(但是在当前回话可以看到插入的数据),但是你用SQLPLUS EXIT之后再次登录就可以看到插入的数据了,因为ORACLE ...
- Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏
内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了
- CUMTCTF'2020 未完成 wp
Web babysqli burp抓包,发现有 的过滤,用/**/过滤空格. 报错注入 payload username=admin&password='/**/or/**/extractva ...
- Spring Cloud系列(三):Eureka源码解析之服务端
一.自动装配 1.根据自动装配原理(详见:Spring Boot系列(二):Spring Boot自动装配原理解析),找到spring-cloud-starter-netflix-eureka-ser ...