go-gin-基础

2020-01-14 14:05:4410/1/2021, 3:34:43 AM

获取GET path参数

  func main() {
    r := gin.Default()
    r.GET("/index/:id", func(context *gin.Context){
      r.JOSN(http.StatusOK, gin.H{
        "id": context.Param("id"),
      })
    })
  }

获取POST raw json参数

  1. 定义一个公用struct,用于标准返回数据格式
      type ResBodyS struct {
     ErrCode int `json:"errCode"`
     Desc string `json:"description" binding:"required"` //参数存在性校验
      }
    
  2. 定义针对于特定接口的struct
      type IndexReqBodyS struct {
     ResBodyS
     Data string `json:"index"`
      }
    
  3. 使用context.BindJSON()解析请求中的body参数
      func main() {
     r := gin,Default()
     r.POST("/index", func(context *gin.Context){
       var reqInfo IndexReqBodyS
       err := context.BindJSON(&reqInfo)
       if err != nil {
         fmt.PrintFln("parse json data error! err:", err)
         return
       }
       context.JSON(http.StatusOK, reqInfo)
     })
     r.Run(":9090")
      }
    

捕获异常

在 Go 中异常就是panic,它是在程序运行的时候抛出的,当panic抛出之后,如果在程序里没有添加任何保护措施的话,控制台就会在打印出panic的详细情况,然后终止运行。 当程序发生panic后,在defer(延迟函数) 内部可以调用recover进行捕获。

  defer func() {
    err := recover();
    if err != nil {
      fmp.Println(err)
    }
  }

单元测试

使用net/http/httptest包 与原生测试相比,使用gin.Engine.ServeHTTP发送请求(原生使用http.HandlerFunc.ServeHTTP)

var engine *gin.Engine

const accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODA5OTE1NTUsInVzZXJfaWQiOjE4LCJuYW1lIjoidGVzdDEifQ.900X9t3qveW0NGn3_FhYxHXlgsLAdl1BkjfKxNlBNyE"

func CreateRequest(method constant.HttpRequestMethod, url string, params interface{}) (status constant.ResultCode, resBody *util.ResS, returnError error) {
    if engine == nil {
        gin.SetMode(gin.ReleaseMode)
        engine = gin.New()
        database.SetUpDatabase()
        controller.SetupRouter(engine)
    }

    var (
        rr        = httptest.NewRecorder()
        req       = new(http.Request)
        err error = nil
    )
    if params != nil {
        tmp, err := json.Encode(params)
        if err != nil {
            return constant.FAILED, nil, err
        }
        req, err = http.NewRequest(string(method), url, bytes.NewBuffer([]byte(tmp)))
    } else {
        req, err = http.NewRequest(string(method), url, nil)
    }
    if err != nil {
        return constant.FAILED, nil, err
    }

    req.Header.Add("Authorization", fmt.Sprintf("Bear %s", accessToken))
    engine.ServeHTTP(rr, req)

    formatRes := util.ResS{}
    err = json.Decode(rr.Body.Bytes(), &formatRes)
    if err != nil {
        return constant.FAILED, nil, err
    }
    return constant.SUCCESS, &formatRes, nil
}

func CreateTest(t *testing.T, method constant.HttpRequestMethod, url string, params interface{}) {
    _, resBody, err := CreateRequest(method, url, params)
    if err != nil {
        t.Errorf("got error: %s", err.Error())
        return
    }
    if resBody != nil {
        if resBody.Code != constant.SUCCESS {
            t.Errorf("GetInfo test failed, got: %v, info: %s", resBody.Data, resBody.Message)
        }
    }
}