基于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技术拾遗
基于gin的golang web开发:Gin技术拾遗的更多相关文章
- 基于gin的golang web开发:路由
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...
- 基于gin的golang web开发:路由二
在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...
- 基于gin的golang web开发:模型绑定
在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...
- 基于gin的golang web开发:模型验证
Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...
- 基于gin的golang web开发:访问mysql数据库
web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...
- 基于gin的golang web开发:使用数据库事务
在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- 基于gin的golang web开发:中间件
gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...
- 基于gin的golang web开发:集成swagger
在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种 ...
随机推荐
- 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖
1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好.更快的决策.Amazon Simple Storage Service(amaz ...
- RabbitMQ的简单封装
一般在工作中,都是直接使用已经封装好的mq的程序集进行功能开发.所以很多时候都没有去了解rabbitmq到底是如何封装(实现使用的).所以心血来潮,简单记录下自己对rabbitmq的简单封装 整体的思 ...
- simulink产生周期矩形波和8421码
初次入门simulink,由于学习了数字逻辑,试图进行仿真,首先需要的就是8421码,但是没找到simulink里面相关模块,如果各位知道怎么弄可以评论告诉我分享分享哈哈 我用的是matlab2016 ...
- Cassandra数据模型和模式(Schema)的配置检查
免责声明 本文档提供了有关DataStax Enterprise(DSE)和Apache Cassandra的常规数据建模和架构配置建议.本文档需要DSE / Cassandra基本知识.它不能代替官 ...
- 2012年游戏软件开发独立本科段01B0815自考科目
01B0815自考科目 课程代码[学分] 课程名称 03708[02] 中国近现代史纲要 03709[04] 马克主义基本原理概论 03684[10] 综合英语(四) 01042[05] 应用数学 0 ...
- mysql中key和index的关系
原文链接:https://blog.csdn.net/top_code/article/details/50599840
- 钉钉自定义机器人webhook
这篇博文主要讲的是如何进行自定义定时发送一些text类的消息的自定义机器人.添加过程不细讲了. 首先我们需要拿到一个Hook地址,就是你在添加自定义机器人的时候有个,如图: 然后开始编写我们的脚本,我 ...
- spring的原理
一.pring的原理 1.1 IOC控制反转 ==> 扫描机制通过代理方式动态创建对象 扫描注解,通过反射获取类路径,动态创建对应类的对象,放置在对象池中(多线程做法,防止短时间内创建对象过多, ...
- Python_opencv库
1.车牌检测 ''' 项目名称:opencv/cv2 车牌检测 简介: 1.训练级联表 ***.xml [跳过...] 2.用如下代码加载级联表和目标图片识别车牌 注:推荐用anconda安装open ...
- 【芯片手册开发】Sil9136音频开发详细分析+源码实战
目录 前言 参考 手册使用+实战 配置 Configuring Audio Using I2S 总结实现 前言 默认在开发了视频方面后 这方面的工作本来可以找技术支持拿个例程参考下,很快就可以的写出来 ...