Go Gin 框架

说Gin是一个框架,不如说Gin是一个类库或者工具库,其包含了可以组成框架的组件。这样会更好理解一点。

举个

下面的示例代码在这:github

利用Gin组成最基本的框架。说到框架,我们可以先列举下需要的(最基本)组件,主要四块,以及下面的重点。

  • 端口监听

    • 用于监听请求,也就是服务
  • 请求处理
    • 请求分发
    • 结果处理
  • 路由
    • 路由编写
    • 路由接入
  • 业务处理
    • 写一个demo

好,开搞!

前提
* 你已经安装好go环境,没安装的可以百度下,教程很多
* 你已经安装了Gin,如果没安装,安装命令:go get -u github.com/gin-gonic/gin
// Github上有https://github.com/gin-gonic/gin,大牛直接看这个不用看下面的了
* 建一个项目文件夹 gogo
* 初始化环境go mod init 模块名或者项目名
// 比如我把这个测试项目取名为 gogo ; go mod init gogo

端口监听

端口监听: 主要是监听端口的消息,提供服务入口。

文件位置:~/gogo/server.go

package main
import (
"github.com/gin-gonic/gin"
"net/http"
) func main() {
server := gin.Default()
server.GET("/", func(c *gin.Context) {
param := c.DefaultQuery("name", "Guest") //注意:gin.Context 、参数获取
c.JSON(http.StatusOK, gin.H{
"message": "hello 测试通过",
"data":param,
})
})
server.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
} ---------------------------
// 注意上面标识“注意”的行,后面可能会用到
// http://127.0.0.1:8080/?name=123456789
{
data: "123456789",
message: "hello 测试通过"
}

为了框架的整体连贯性,后面会对其优化。

请求处理

请求与返回可以看成业务处理的前置和后置部分,一般分为两部分request和response,即 请求处理和返回处理,如下:

从这里我将代码统一放到web的app目录下,具体路径如下

请求处理

~/gogo/app/distribute/request.go

package distribute

import (
"github.com/gin-gonic/gin"
) /**
分配:链接上下文
link context
*/ // 定义一个接受参数的函数类型
type AppReqestFunc func(*AppReqest) //定义参数结构体
type AppReqest struct {
*gin.Context
} /*
定义参数赋予方法
*/
func Handle(r AppReqestFunc) gin.HandlerFunc {
// gin.HandlerFunc 理解为一种可操作的函数接口,匿名函数
return func(c *gin.Context) {
r(&AppReqest{c})
}
} /*
定义参数获取法
*/ //定义获取get参数
func (params AppReqest) InputGet(paramName string) string {
return params.DefaultQuery(paramName, "")
} /*
定义返回方法
*/ //成功返回
func (c *AppReqest) Success(data interface{}) {
c.JSON(Success(data))
}

Handle定义了需要接受一个函数类型AppReqestFunc func(*AppReqest),其中参数满足AppReqest

会返回一个gin.HandlerFunc类型,这个类型适用于Gin的路由参数类型(即gin可调用)。

这里Handle可以做一些自定义的扩展。

返回处理

~/gogo/app/distribute/response.go

package distribute

import (
"github.com/gin-gonic/gin"
"net/http"
"reflect" // 对象操作的类
) /**
成功返回,你可以建其它返回,如失败、错误
Successful return, you can create other returns, such as failure and error
*/
func Success(data interface{}) (int, gin.H) {
ref := reflect.ValueOf(data)
if ref.IsNil() {
return http.StatusOK, gin.H{
"code": http.StatusOK,
"data": make(map[string]interface{}),
"message": "请求成功",
}
} else {
return http.StatusOK, gin.H{
"code": http.StatusOK,
"data": data,
"message": "请求成功",
}
}
}

一个返回格式,大致了解就行,可以自行丰富。

总结:上面两个文件分别是如何接受请求头,和返回的格式,注意下参数赋予方法 这个可能不好理解,可以在纸上面画画,方便理解。

路由

路由编写

为了以后的路由扩展,将server中的路由单独存放,代码如下:

~/gogo/app/routes/api.go

package routes

import (
"github.com/gin-gonic/gin"
// "gogo/app/http" //业务模块
"gogo/app/distribute"
) func Route(e *gin.Engine) { //test
e.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello",
})
})
// 业务
// test := http.TestController{}
// e.GET("/test", distribute.Handle(test.Test))
// e.GET("/hello", distribute.Handle(test.Hello))
}

路由还可以分组,分文件,这里就不过多描述了,可以自己想想怎么扩展。

上面的e.GET可以按自己的需求进行编写,这里是举了个

路由接入

为了将路由使用到项目中,需要一个中间衔接的文件,实现方式为添加一个启动文件,将启动服务时需要加载的文件或功能加载进来。

~/gogo/app/boot/bootstrap.go

package boot

import (
"github.com/gin-gonic/gin"
"gogo/app/routes"
) // 启动入口
func Bootstrap(c *gin.Engine) {
SetRoute(c)
} // 路由入口
func SetRoute(c *gin.Engine) {
routes.Route(c)
}

这里将上面路由文件加载进来了,现在改造服务文件,加这个文件加载进去。

package main
import (
"github.com/gin-gonic/gin"
// "net/http"
"gogo/app/boot"
) func main() {
server := gin.Default() boot.Bootstrap(server)
// server.GET("/", func(c *gin.Context) {
// param := c.DefaultQuery("name", "Guest")
// c.JSON(http.StatusOK, gin.H{
// "message": "hello 测试通过",
// "data":param,
// })
// }) server.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

和最前面的对比,可以看见,将路由替换为了:boot.Bootstrap(server),进行加载路由文件。

业务处理

一个业务demo

注意前面路由文件,有个路由如下

    // 业务
// test := http.TestController{}
// e.GET("/test", distribute.Handle(test.Test))
// e.GET("/hello", distribute.Handle(test.Hello))

将其全部打开;同时可以看到头部的引入:"gogo/app/http" ;所以下面看看业务文件怎么编写:

~/gogo/app/http/test.go

package httpimport (	"github.com/gin-gonic/gin"	"gogo/app/distribute"	"fmt")type TestController  struct {}func (r *TestController) Hello(request *distribute.AppReqest) {	fmt.Println("Ok");	request.Success(make([]int, 0));}func (r *TestController) Test(request *distribute.AppReqest) {		request.JSON(200, gin.H{			"message": "hello 测试通过",		})}

上面的Hello和Test就是业务代码块,展示了返回的方式success即是上面说到的返回处理。如果是复杂逻辑可以将详细的业务代码引入到这里,就不赘述了。

测试例子

http://127.0.0.1:8080/hello
-----------------------------------
{
code: 200,
data: [ ],
message: "请求成功"
}

新增方法

例子:

gogo/app/routes/api.go增加路由

// exp: get 、 param
e.GET("/get", distribute.Handle(test.TestGet))

gogo/app/http/test.go增加业务代码

func (r *TestController) TestGet(request *distribute.AppReqest) {
var data = []string{}
var name = request.InputGet("name")
data = append(data,name)
request.Success(data);
}

请求

http://127.0.0.1:8080/get?name=Lucy
-----------------------------------
{
code: 200,
data: [
"Lucy"
],
message: "请求成功"
}

至此,一个微型的例子就完成了。目录结构如下:

|____go.mod
|____server.go
|____app
| |____boot
| | |____bootstrap.go
| |____distribute
| | |____response.go
| | |____request.go
| |____http
| | |____test.go
| |____routes
| | |____api.go
|____LICENSE
|____go.sum
|____README.md

结束

基础的学习go web,深入的话还是需要实践。

上面的代码在这:github

嗯,真的结束了!

Go学习【02】:理解Gin,搭一个web demo的更多相关文章

  1. maven学习3,如何创建一个web项目

      Maven学习 (三) 使用m2eclipse创建web项目   1.首先确认你的eclipse已经安装好m2eclipse的环境,可以参照上两篇Maven学习内容 2.新建一个maven的项目 ...

  2. 树莓派(raspberry pi)学习11: 将树莓派变成一个Web服务器(转)

    将树莓派变成一个Web服务器,通过访问网页,就可以控制树莓派,比如:查看摄像头\开灯等等. 一想到Linux Web服务器,我们首先想到的是,Apache + MySql + Php. 树莓派可以安装 ...

  3. USBWebServer - 在U盘里搭一个Web服务器!

    文章选自我的博客:https://blog.ljyngup.com/archives/321.html/ 本文将介绍一款可以在U盘内直接搭建Web服务器的软件 软件可以免安装直接在U盘内运行,适合外出 ...

  4. python爬虫学习(8) —— 关于4399的一个小Demo

    堂弟喜欢各种游戏,在没有网络的情况下,上4399显得很无力. 另外,4399广告好多,,而且加载慢.. 怎么办,,写个爬虫吧,,把4399上的"好玩"游戏爬下来. 1. 分析阶段 ...

  5. 学习react,动手实现一个小demo(仿知乎问答)

    学习react也有一周的时间,最近自己做了个仿知乎问答的小demo,项目源码在github上:https://github.com/yang302/reactQa 使用技术:bower+gulp+re ...

  6. 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架

    在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...

  7. 移动端学习之理解WEB APP、Native APP、Hybrid APP以及React Native/uniapp包括H5、小程序等的区别与共通之处

    因为工作需要,需要进一步了解移动端的开发,遂返回复习移动端的知识点,在开始学习之前,产生了疑惑WEB APP .Native APP .Hybrid APP.React Native.Uniapp.H ...

  8. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  9. servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解1

    servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解 (2013-06-19 19:30:40) 转载▼     servlet的非线程安全,action的线程安全 对提交 ...

随机推荐

  1. 浅谈 SQL 注入(注入篇)

    一.SQL注入简介 1.1 什么是SQL注入 在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条 SQL语句传递给web ...

  2. 博客CSS样式 二

    预览 可自行更改颜色 背景图 页面定制 CSS 代码中加入: url为背景图地址,可下载心仪背景图后上传到博客园相册后获取地址 body { color: #000; background: url( ...

  3. 11-SpringCloud Hystrix

    Hystrix简介 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务 ...

  4. 面对对象4 Mixins机制 内置方法 反射 异常

    Mixins机制 为什么要有:子类继承父类的时候,可能会碰到需要继承多个父类的情况,那么继承关系也分主类和辅类,既保持主类的功能,也有辅类的功能. 命名方式,我们需要将主类和辅类区分开来,python ...

  5. 带你梳理Jetty自定义ProxyServlet实现反向代理服务

    摘要:最近要做一个将K8s中的某组件UI通过反向代理映射到自定义规则的链接地址上,提供给用户访问的需求.所以顺便研究了一下Jetty的ProxyServlet. 本文分享自华为云社区<Jetty ...

  6. C#多线程---I/O线程实现异步请求

    一.场景 利用I/O线程来模拟浏览器对服务器请求的异步操作. 二.例子 1 using System; 2 using System.Collections.Generic; 3 using Syst ...

  7. [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击

    MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request ...

  8. JOB状态与并发

    由于job每次被执行时都会创建一个新的实例, jobDetail实例时,要进行数据存储或者,特殊字段操作,需要每次schedul执行job时保留之前的数据, 那么就需要job在有状态下保持之前的数据信 ...

  9. 利用元数据提高 SQLFlow 血缘分析结果准确率

    利用元数据提高 SQLFlow 血缘分析结果准确率 一.SQLFlow--数据治理专家的一把利器 数据血缘属于数据治理中的一个概念,是在数据溯源的过程中找到相关数据之间的联系,它是一个逻辑概念.数据治 ...

  10. 第20篇-加载与存储指令之ldc与_fast_aldc指令(2)

    ldc指令将int.float.或者一个类.方法类型或方法句柄的符号引用.还可能是String型常量值从常量池中推送至栈顶. 这一篇介绍一个虚拟机规范中定义的一个字节码指令ldc,另外还有一个虚拟机内 ...