• 基于gin的golang web开发:Gin技术拾遗


    本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题。

    拾遗1:单元测试

    Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testing.T类型。以下是一个计算hash值的工具包和对应的单元测试。

    hashUtils.go

    package utils
    
    import (
    	"crypto/md5"
    	"crypto/sha1"
    	"fmt"
    )
    
    func Md5(str string) string {
    	data := []byte(str)
    	has := md5.Sum(data)
    	return fmt.Sprintf("%X", has)
    }
    
    func SHA1(data []byte) []byte {
    	h := sha1.New()
    	h.Write(data)
    	return h.Sum(nil)
    }
    

    hashUtils_test.go

    package utils
    
    import (
    	"fmt"
    	"testing"
    )
    
    func TestMd5(t *testing.T) {
    	content := "123456"
    	md5 := Md5(content)
    
    	if "E10ADC3949BA59ABBE56E057F20F883E" != md5 {
    		t.Errorf("md5 failed")
    	}
    }
    
    func TestSHA1(t *testing.T) {
    	content := "123456"
    	sha1 := fmt.Sprintf("%x", SHA1([]byte(content)))
    
    	if "7c4a8d09ca3762af61e59520943dc26494f8941b" != sha1 {
    		t.Errorf("sha1 failed")
    	}
    }
    

    除了测试这种逻辑代码我们还需要测试HTTP的请求响应。Gin推荐使用net/http/httptest测试HTTP相关的代码。

    启动一个Gin服务器main.go

    package main
    
    func setupRouter() *gin.Engine {
    	r := gin.Default()
    	r.GET("/ping", func(c *gin.Context) {
    		c.String(200, "pong")
    	})
    	return r
    }
    
    func main() {
    	r := setupRouter()
    	r.Run(":8080")
    }
    

    单元测试main_test.go

    package main
    
    import (
    	"net/http"
    	"net/http/httptest"
    	"testing"
    
    	"github.com/stretchr/testify/assert"
    )
    
    func TestPingRoute(t *testing.T) {
    	router := setupRouter()
    
    	w := httptest.NewRecorder()
    	req, _ := http.NewRequest("GET", "/ping", nil)
    	router.ServeHTTP(w, req)
    
    	assert.Equal(t, 200, w.Code)
    	assert.Equal(t, "pong", w.Body.String())
    }
    

    拾遗2:路由

    先看代码

    userRouter := router.Group(`users`)
    {
    	userRouter.GET(`/`, userHandler.UserList)
    }
    

    我们声明了路由/users/,这是一个Web Api,传入参数的url大概是这样的/users/?pageIndex=1&pageSize=10。用户访问/users?pageIndex=1&pageSize=10时也能正常返回数据,这是因为Gin帮我们做了一次301跳转,问题就出在这里。我们的路由是Web Api用户可能是JS前端,也可能是其他的业务系统。如果用户不支持301跳转呢?

    其实我们只要在增加一个空路径路由就可以解决问题。

    userRouter := router.Group(`users`)
    {
    	userRouter.GET(``, userHandler.UserList)
    	userRouter.GET(`/`, userHandler.UserList)
    }
    

    现在不管用户访问/users/?pageIndex=1&pageSize=10还是访问/users?pageIndex=1&pageSize=10都会得到正确的结果。

    文章出处:基于gin的golang web开发:Gin技术拾遗

  • 相关阅读:
    【hacker101 CTF】Photo Gallery
    Linux内网渗透(一)——容器逃逸
    JWT原理及常见攻击方式
    【红日安全VulnStack】ATT&CK实战系列——红队实战(二)
    内网穿透的常用方法总结
    文件上传利用总结
    Windows&Linux文件传输方式总结
    通过WebGoat学习java反序列化漏洞
    绕过WAF进行常见Web漏洞利用
    wifi钓鱼
  • 原文地址:https://www.cnblogs.com/huaface/p/14085648.html
Copyright © 2020-2023  润新知