说明

介绍如何在handler里获取到参数。以及如何使用参数校验器

解析参数

因为是集成的https://github.com/gin-gonic/gin,所以想要更知道更详细的请参考官方文档。以下为简单介绍

  • GET请求
    1. // /index?id=1
    2. func IndexHandler(ctx *gin.Context) {
    3. id := ctx.Query("id")
    4. }
  • POST请求(表单)

    1. func IndexHandler(ctx *gin.Context) {
    2. id := ctx.PostForm("id")
    3. }
  • POST请求(Json)

    1. var req Request{
    2. Id int `json:"id"`
    3. }
    4. func IndexHandler(ctx *gin.Context) {
    5. var req Request
    6. if err := ctx.ShouldBindJson(&req); err != nil {
    7. response.WrapContext(ctx).Error(1001, "参数错误:" + err.Error())
    8. return
    9. }
    10. }
  • Restful

    1. // /index/1
    2. func route(router *gin.Engine) {
    3. router.Get("/index/:id", IndexHandler)
    4. }
    5. func IndexHandler(ctx *gin.Context) {
    6. id := ctx.Param("id")
    7. }

以上是gin官方支持的常规获取参数的方法。对于一般的少数参数来说,上面的方法已足够。但对于参数超过三个的接口,推荐使用ShouldBind()来解析成一个结构体,代码简洁且易于扩展

  • ShouldBind
    1. var req Request{
    2. Id int `json:"id"` // 如果是get请求,使用query替换json,如果是post表单的请求,使用form替换json
    3. Name string `json:"name"`
    4. Age int `json:"age"`
    5. }
    6. func IndexHandler(ctx *gin.Context) {
    7. var req Request
    8. if err := ctx.ShouldBind(&req); err != nil {
    9. response.WrapContext(ctx).Error(1001, "参数错误:" + err.Error())
    10. return
    11. }
    12. }

参数校验器

该参数校验器是基于https://github.com/go-playground/validator实现,支持该包的所有规则。同时自定义的comment字段,以及错误提示转换为中文。

  1. type AuthRequest struct {
  2. // 如果是表单提交,使用form,否则获取不到数据
  3. Email string `json:"email" binding:"required,email" comment:"邮箱"` // 参数必填,同时验证邮箱格式
  4. Pass string `json:"pass" binding:"required,min=6,max=10" comment:"密码"` // 参数必填,同时要求密码长度为6~10位
  5. }
  6. var request AuthRequest
  7. if err := ctx.ShouldBind(&request); err != nil {
  8. response.WrapContext(ctx).Error(1001, "参数错误:" + err.Error())
  9. return
  10. }

如果请求参数里的pass为空,则响应内容为:

  1. {
  2. "code": 1001,
  3. "message": "参数错误:密码为必填字段",
  4. "data": null,
  5. "meta": {
  6. "trace": {
  7. "trace_id": "trace:eea596a4-ef3c-46ea-90db-2c20e56fc725",
  8. "request_id": "request:2d892e13-1ab1-4b16-8d55-4284cf38ff4f"
  9. },
  10. "pagination": null
  11. }
  12. }

建议大家在struct里定义校验规则,这样可以在主业务里避免繁杂的参数判断,提高代码的整洁度,也更容易扩展。