在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参数的时候再用这种方法就要调用很多次获取参数的方法,本文将介绍一种新的接收参数的方法来解决这个问题:模型绑定. gin中的模型绑定可以理解为:把请求的参数映射为一个具体的类型.gin支持JSON,XML,YAML和表单参数等多种参数格式,只需要在对应的字段上声明标签. 绑定表单或者查询字符串 type…
本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题. 拾遗1:单元测试 Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testing.T类型.以下是一个计算hash值的工具包和对应的单元测试. hashUtils.go package utils import ( "crypto/md5" "crypto/sha1" "fmt" ) func Md5(str string)…
基于滴答清单 Web 开发的 PC 客户端 关于「滴答清单」 滴答清单是一款不可多得的 GTD 效率工具,它有着清晰明了的界面设计.恰到好处的功能设置.稳定的同步服务,如果你还缺少一款简洁而有效的 GTD 时间管理工具,滴答清单是不错的选择. -- 少数派 滴答清单是一款跨平台同步的待办事项和任务提醒软件: 滴答清单能够协助您完成待办事务,比如工作计划.生日提醒.旅行安排.会议准备等,以便更好的规划时间和安排生活: 滴答清单几乎覆盖了日常生活中的所有平台: PC(高级会员) Android iP…
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的命令安装Gin go get -u github.com/gin-gonic/gin 在代码里添加依赖 import "github.com/gin-gonic/gin" 快速启动一个Gin服务器的代码如下 package main import "github.com/gin-…
在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基于Gin的文件上传. func main() { router := gin.Default() router.MaxMultipartMemory = 8 << 20 // 8 MiB router.POST("/upload", func(c *gin.Context) {…
Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发web api的时候大部分参数都是需要验证的,比如email参数要验证是否是邮箱格式.phone参数要验证是否是手机号格式等等,使用模型验证方法可以将验证过程隔离在业务之外. 内置的验证标签 Gin通过集成go-playground/validator提供模型验证功能,并提供了很多常用验证规则可以满足我们大部…
web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有一个用来处理空值的包guregu/null. go get github.com/go-sql-driver/mysql go get gopkg.in/guregu/null.v4 go get github.com/jmoiron/sqlx 连接数据库 jmoiron/sqlx包为databas…
在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go语言的延迟执行语句,defer后面的语句会被go进行延迟处理,在函数即将结束的时候,defer后面的语句将逆序执行.也就是说,先defer的语句最后执行.defer很像java或者C#中的finally语句.下面通过一个例子看一下defer. package main import "fmt&quo…
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get github.com/jmoiron/sqlx go get github.com/go-sql-driver/mysql 连接数据库 db, err := sqlx.Connect("mysql", "...?parseTime=true") if err != nil {…
gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等. 使用中间件 gin的中间件分为三类:全局中间件.路由中间件.分组路由中间件. 全局中间件:注册全局中间件之后注册的路由才会生效,如果有一些不希望使用全局中间件的路由规则,注册路由代码要放在注册全局中间件之前. 路由中间件:在注册路由时传入的中间件,只对当前路由规则生效. 分组路由中间件:在分组路…
在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种新的维护文档的方式,在gin中只需要编写一些注释即可生成一份可交互的接口文档. go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/…
作为后端开发者我们要记住一句话:"永远不要相信用户的输入",这里所说的用户可能是人,也可能是另一个应用程序."永远不要相信用户的输入"是安全编码的准则,也就是说,任何输入的内容在验证无害之前都是有害的.很多应用程序的安全漏洞都和用户输入有关,比如SQL注入漏洞. 我们可以通过参数验证.sql语句过滤和参数化查询等方式对用户的输入进行处理来规避这种安全隐患.本文介绍第一种方法,并对基于gin的golang web开发:模型验证进行补充,了解更多的参数验证方法. 验证非…
Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令启动一个centos容器并进入bash交互环境. docker run -it --rm centos bash -it 组合参数-i: 以交互模式运行容器,-t: 为容器重新分配一个伪输入终端. --rm 在容器退出时就能够自动清理容器. alpine镜像中没有bash,启动容器并进入终端的命令为…
JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c JWT由三部分组成,每个部分之间用点…
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST客户端工具包,简单是指使用上非常简单.Resty在使用简单的基础上提供了非常强大的功能,涉及到HTTP客户端的方方面面,可以满足我们日常开发使用的大部分需求. go get安装 go get github.com/go-resty/resty/v2 使用Resty提交HTTP请求 client :=…
前文分别介绍过了Resty和gin-jwt两个包,Resty是一个HTTP和REST客户端,gin-jwt是一个实现了JWT的Gin中间件.本文将使用这两个包来实现一个简单的用户登录功能. 环境准备 实现登录功能之前要提前准备一个用于查询用户是否存在的服务.访问服务http://127.0.0.1:18081/users?username=root时返回用户root的相关信息 { "total": 1, "data": [ { "id": 1,…
hi-nginx通过redis管理会话. 要开启管理,需要做三件事. 第一件开启userid: userid on; userid_name SESSIONID; userid_domain localhost; userid_path /; userid_expires 300s; 这个功能是nginx内建的,可以直接使用.需要注意的是,hi-nginx只认识SESSIONID的userid_name. 第二件是配置redis服务器: hi_redis_host 127.0.0.1; hi_r…
作为一名IT届的后生,当初也经历过懵懂无知的实习期,对那种无力感深有体会.在这,希望能用我这几年的开发经验,让各位即将踏入或者刚刚踏入web开发领域的新人们少走些弯路.鉴于这是入门篇,下面我就从零为大家介绍. 这里我主要介绍基于 H5,CSS,JS,PHP的web开发,入门篇的内容简单,完全可以自学,下面就为大家整理些制作静态网页的基础知识.以下是HTML5的内容. HTML5:万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改.博主我用的是HBuilder…
本文提纲 1. spring-boot-starter-web 依赖概述 1.1 spring-boot-starter-web 职责 1.2 spring-boot-starter-web 依赖关系 2. Spring MVC on Spring Boot 2.1 Spring MVC 体系温故知新 2.2 重要的类 2.3 Spring Boot MVC 2.3.1 控制器 2.3.2 数据绑定 2.3.3 视图和视图解析 一.spring-boot-starter-web 依赖概述 在 S…
问题由来 最近在研究适合团队开发的web架构解决方案,该架构即要适合分工协作又要有一定扩展性,适合不同的数据库需要,因此我查阅了一些资料,初步构想出了一套架构,请各位多多指教. 探索 web开发架构最经典莫过于三层架构,表示层.逻辑层.数据处理层. 数据访问层:其功能主要是负责数据库的访问. 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关. 表示层:是系统的UI部分,负责使用者与整个系统的交互.理想的状态是表示层不应包括系统的业务逻辑. 这些是经典的解释,如果要适合不同的数据库则需…
几乎所有的网站都提供了用户注册与管理功能,这一节,我们将讲解如何利用Django自身提供的用户认证系统实现用户注册与管理功能. 会话认证 在上一节中,我们学习了User数据模型,并用它来保存用户信息,实际上用户数据模型只是Django提供的认证管理系统的一小部分,Django认证系统位于django.contrib.auth包中,默认情况下是已经安装了的. 可以通过检查settings.py文件中的INSTALLED_APPS来判断是否已经安装了,它的配置信息应该如下: INSTALLED_AP…
一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话. 二.会话过程中要解决的一些问题? 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据. 三.保存会话数据的两种技术 3.1.Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户…
一.Cookie的概念 Cookie(会话)可以简单的理解为:用户开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器,整个过程称为一个会话. 二.会话过程中解决的问题 用户在使用浏览器与服务器进行会话的过程中,不可避免的产生一些数据,程序需要为每个用户保存这些数据. 三.保存会话的两种技术 Cookie Cookie是客户端技术,程序把每个用户的额数据以Cookie的方式写个各自用户的浏览器. Session Session是服务端技术,利用这个技术,服务器在运行时可以为每个用…
一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话. 二.会话过程中要解决的一些问题? 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据. 三.保存会话数据的两种技术 3.1.Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户…
一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话. 二.会话过程中要解决的一些问题? 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据. 三.保存会话数据的两种技术 3.1.Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户…
一.Vue教程 vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组件和vue生态系统支持的库开发的复杂单页应用.vue.js的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件. 这里介绍一些我学习vue时用的教程. 1.入门教程 官网教程:https://cn.vuejs.org/v2/guide/ vue.js的官网教程是很全面的,包括文档和视频.…
单击第一个图标,第一个图标突出显示,单击第二个图标,第一个变灰,第二个突出显示,反之一样.单击history读取历史记录. Controller ZCL_SUS_C_ORDER_CHANGE 1.    DO_INIT method DO_INIT. *CALL METHOD SUPER->DO_INIT *    . if  ZORDERCHANGEMODEL is initial. create object ZORDERCHANGEMODEL. select * from usr02 in…
Model-View-Controller 简称MVC. 简单的说就是把数据处理,显示,页面事件及处理过程分离开来,企业应用多数都采用这种方式,多层架构的优缺点不再多言,google一下啥都知道. 在企业应用中我们以SRMSUS 为例. 系统由以下结构组成   Controller来处理系统事件及数据过程 Views 是页面/子页面 Page 是带有逻辑过程的页面,之前介绍过 Page Fragments ,例如很多页面需要header及footer,这个东西就是一些代码片断,可以被出入到需要的…
Cookie Cookie的由来 HTTP协议是无状态的,无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况. 对服务器来说,记不住是谁刚刚发了HTTP请求,所以每次的请求都是全新的. 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据又是我们需要保存的,也就是说要“保持状态”.因此Cookie就是在这样一个场景下诞生. Cookie的…
1.简介 (1)Http是无状态的协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否是同一个客户端,这样的设计严重阻碍了web程序的设计. (2)Cookie是解决Http协议无状态的方案之一. (3)Cookie实际上就是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求时都会将该信息发送给服务器,服务器在收到请求之后,就可以根据该信息处理请求. 2.cookie的用途 电商网站的购物车 保持用户登录状态 3.cookie的使用 this.C…