经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
如何高效定义和验证restful请求的参数
来源:cnblogs  作者:Kevin Wan  时间:2020/11/9 16:09:55  对本文有异议

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

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

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

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

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

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

  1. type (
  2. createOrderReq struct {
  3. token string `path:"token"` // 用户token
  4. productId string `json:"productId"` // 商品ID
  5. num int `json:"num"` // 商品数量
  6. }
  7. createOrderRes struct {
  8. success bool `json:"success"` // 是否成功
  9. }
  10. findOrderReq struct {
  11. token string `path:"token"` // 用户token
  12. page int `form:"page"` // 页数
  13. pageSize int8 `form:"pageSize"` // 页大小
  14. }
  15. findOrderRes struct {
  16. orderInfo []orderInfo `json:"orderInfo"` // 商品ID
  17. }
  18. orderInfo struct {
  19. productId string `json:"productId"` // 商品ID
  20. productName string `json:"productName"` // 商品名称
  21. num int `json:"num"` // 商品数量
  22. }
  23. deleteOrderReq struct {
  24. id string `path:"id"`
  25. }
  26. deleteOrderRes struct {
  27. success bool `json:"success"` // 是否成功
  28. }
  29. )
  30. service order {
  31. @doc(
  32. summary: 创建订单
  33. )
  34. @handler CreateOrderHandler
  35. post /order/add/:token(createOrderReq) returns(createOrderRes)
  36. @doc(
  37. summary: 获取订单
  38. )
  39. @handler FindOrderHandler
  40. get /order/find/:token(findOrderReq) returns(findOrderRes)
  41. @doc(
  42. summary: 删除订单
  43. )
  44. @handler: DeleteOrderHandler
  45. delete /order/:id(deleteOrderReq) returns(deleteOrderRes)
  46. }

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文件为例

  1. type (
  2. createUserReq struct {
  3. age int8 `json:"age,default=20,range=(12:100]"` // 年龄
  4. name string `json:"name"` // 名字
  5. alias string `json:"alias,optional"` // 别名
  6. sex string `json:"sex,options=male|female"` // 性别
  7. avatar string `json:"avatar,default=default.png"` // 头像
  8. }
  9. createUserRes struct {
  10. success bool `json:"success"` // 是否成功
  11. }
  12. )
  13. service user {
  14. @doc(
  15. summary: 创建订单
  16. )
  17. @handler CreateUserHandler
  18. post /user/add(createUserReq) returns(createUserRes)
  19. }

数据校验有很多种方式,包括以下但不限:

  • 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

好未来技术

原文链接:http://www.cnblogs.com/kevinwan/p/13845642.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号