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

拾遗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技术拾遗

基于gin的golang web开发:Gin技术拾遗的更多相关文章

  1. 基于gin的golang web开发:路由

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...

  2. 基于gin的golang web开发:路由二

    在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...

  3. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  4. 基于gin的golang web开发:模型验证

    Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...

  5. 基于gin的golang web开发:访问mysql数据库

    web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...

  6. 基于gin的golang web开发:使用数据库事务

    在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go ...

  7. 基于gin的golang web开发:mysql增删改查

    Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...

  8. 基于gin的golang web开发:中间件

    gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...

  9. 基于gin的golang web开发:集成swagger

    在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...

随机推荐

  1. PASS模型-第一周个人报告

    PASS模型-第一周个人报告 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE2020 作业要求 https://edu.cnblogs.com/campus ...

  2. shp文件转dwg并创建文本标注

    不得不说,ArcGIS 和 CAD 之间的兼容性非常差,shapefile文件和dwg文件之间互相转换会丢失各种属性,但是很多时候他们之间的转换对我们来说是刚需.通常我们都是通过第三方软件(如FME) ...

  3. ACM已刷题

    ZOJ: 1001.1002.1003.1004.1005.1006.1037.1045.1048.1049.1067.1087.1091.1016. swjtuoj: 2433 注:没链接的应该是最 ...

  4. 前端未来趋势之原生API:Web Components

    声明:未经允许,不得转载. Web Components 现世很久了,所以你可能听说过,甚至学习过,非常了解了.但是没关系,可以再重温一下,温故知新. 浏览器原生能力越来越强. js 曾经的 JQue ...

  5. Javasript中this指向问题和改变this指向的方法

    在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...

  6. 痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的开源项目 RT-UFL. 痞子衡在近两年多的i.MXRT客户项目支持过程中,遇到的一个相当高频的问题就是制作i.MXRT下载算法.我们 ...

  7. 17、ContentType组件

    一 项目背景 路飞学成项目,有课程,学位课(不同的课程字段不一样),价格策略 问题: ​ 1 如何设计表结构,来表示这种规则 ​ 2 为专题课,添加三个价格策略 ​ 3 查询所有价格策略,并且显示对应 ...

  8. leetcode 98:n-queens-ii

    题目描述 继续思考"n-queens"问题 这次我们不是输出皇后的排列情况,而是输出n皇后问题一共有多少种解法 Follow up for N-Queens problem. No ...

  9. MyBatis——MyBatis开发流程

    创建项目(IDEA中) 在IDEA中创建 MyBatis项目,详细流程如下: 这里有一点需要注意,我们创建的是Maven项目,如果大家以前没有配置过Maven环境的话,在创建完项目之后,需要配置一下M ...

  10. 模拟鼠标操作(ActionChains)(转 侵删)

    在日常的测试中,经常会遇到需要鼠标去操作的一些事情,比如说悬浮菜单.拖动验证码等,这一节我们来学习如何使用webdriver模拟鼠标的操作 首页模拟鼠标的操作要首先引入ActionChains的包 f ...