当前位置: 首页 > news >正文

Gin框架: 快速搭建起一个Web应用环境及处理不同类型的响应

Gin 框架简介

  • Gin是Golang应用最为广泛的框架之一
  • Gin是轻量级http web框架,简易而高性能,专注于处理高并发场景

Gin框架环境搭建

  • 基于已完成的Go环境, 参考 go mod 环境搭建 ↓
    • https://blog.csdn.net/Tyro_java/article/details/135297367
  • 在初始化好的 go mod 工程内执行安装Gin
    • $ go get -u github.com/gin-gonic/gin
  • 创建 main.go,并引入 gin
    import ( "github.com/gin-gonic/gin"
    )
    

Gin框架搭建并运行一个Web应用

package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建一个默认的路由引擎r := gin.Default()// 配置根路由r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{// c.JSON:返回 JSON 格式的数据"message": "Hello Gin!", })})// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务r.Run()// r.Run(":8081") // 这样可以改变运行的端口
}
  • 运行:$ go run main.go
  • 访问: http://localhost:8080
  • 这是最简单的Gin框架运行效果,页面输出

基于RESTful API的路由响应及参数处理


1 )一般常用的 method 如下,基于此设计路由响应

  • GET(SELECT) 从服务器取出资源(一项或多项)
  • POST(CREATE) 在服务器新建一个资源
  • PUT(UPDATE) 在服务器更新资源(客户端提供改变后的完整资源)
  • DELETE(DELETE) 从服务器删除资源

路由基础配置如下:

package mainimport ("net/http""github.com/gin-gonic/gin"
)var statusOK = http.StatusOKfunc main() {// 创建一个默认的路由引擎r := gin.Default()//配置路由r.GET("/", func(c *gin.Context) {c.String(statusOK, "Hello:%v", "gin")})r.GET("/user", func(c *gin.Context) {c.String(statusOK, "User")})r.POST("/add", func(c *gin.Context) {c.String(statusOK, "add Post")})r.PUT("/edit", func(c *gin.Context) {c.String(statusOK, "edit Put")})r.DELETE("/delete", func(c *gin.Context) {c.String(statusOK, "delete")})r.Run() //启动一个web服务
}

2 )参数匹配处理如下:

package mainimport ("net/http""github.com/gin-gonic/gin"
)var statusOK = http.StatusOKfunc main() {// 创建一个默认的路由引擎r := gin.Default()//配置路由r.GET("/", func(c *gin.Context) {c.String(statusOK, "Hello:%v", "gin")})// 访问示例:/user?id=3r.GET("/user", func(c *gin.Context) {id := c.Query("id")c.String(statusOK, "User: %s", id)})// 访问示例:/book/5r.GET("/book/:id", func(c *gin.Context) {id := c.Param("id")c.String(statusOK, "Book: %s", id)})r.Run() //启动一个web服务
}
  • 这里有两种参数类型,Query 和 Param 两种
    • Query不涉及路由处理
    • Param 要配置路由,属于动态路由
  • 这里用GET形式演示,其他形式获取方式一致

响应不同类型的数据


1 )这里声明下目录结构,方便举例

yourGinProject/ ·······························  根目录├── go.mod ··································  go mod 文件├── go.sum ··································  go sum 文件├── main.go ·································  main 文件└── tpls ····································· html模板目录└──── news.html ·······················  新闻页面模板文件

2 )全量代码演示

main.go

package mainimport ("net/http""github.com/gin-gonic/gin"
)type User struct {Id      int    `json:"id"`Name    string `json:"name"`Hobby   string `json:"hobby"`
}var statusOK = http.StatusOKfunc main() {// 创建一个默认的路由引擎r := gin.Default()// 配置模板的文件r.LoadHTMLGlob("tpls/*")// r.LoadHTMLFiles("tpls/news.html") // 同上,二选一// 1. 响应String报文,根路由r.GET("/", func(c *gin.Context) {c.String(statusOK, "Welcome to %v", "Home Page")})// 2. 响应Json报文,3种方式r.GET("/json1", func(c *gin.Context) {c.JSON(statusOK, map[string]interface{} {"success": true,"msg":     "Gin JSON 1",})})r.GET("/json2", func(c *gin.Context) {c.JSON(statusOK, gin.H{"success": true,"msg":     "Gin JSON 2",})})r.GET("/json3", func(c *gin.Context) {u := &User{Id:      1,Name:    "Wang",Hobby:   "swimming",}c.JSON(statusOK, u)})// 3. 响应JSONP报文r.GET("/jsonp", func(c *gin.Context) {u := &User{Id:     2,Name:    "Lee",Hobby:   "ping pang",}c.JSONP(statusOK, u)})// 4. 响应xml报文r.GET("/xml", func(c *gin.Context) {c.XML(statusOK, gin.H{"success": true,"msg":     "Hello XML",})})// 5. 响应html报文r.GET("/news", func(c *gin.Context) {// r.LoadHTMLGlob("tpls/*") // 可在这里配置,推荐在顶层统一配置// r.LoadHTMLFiles("tpls/news.html") 二选一c.HTML(statusOK, "news.html", gin.H{"title": "新闻标题","content": "这是详细的新闻内容",})})r.Run()
}

3 )不同响应释义

  • 3.1 响应String报文,Context.String

    • 访问 /
    • 响应: Welcome to Home Page
  • 3.2 响应Json报文,Context.JSON

    • 访问:/json1, /json2, json3
    • 这里设定了3种方式, 它们的目的具有一致性
      • map[string]interface{}
      • gin.H
      • &User
  • 3.3 响应JSONP报文,Context.JSONP

    • 访问:/jsonp?callback=fn 这里的 fn 可以是任意字符串
      • fn 作为函数名挂载到浏览器window对象
    • 响应 fn({"id":2,"name":"Lee","hobby":"ping pang"});
  • 3.4 响应XML报文,Context.XML

    • 访问 /xml, 并响应
      <map><success>true</success><msg>Hello XML</msg>
      </map>
      
  • 3.5 响应html报文,Context.HTML

    • 访问 /news
    • 注意 tpls/news.html 中的配置
      • 这里是最简洁配置,生产环境请使用完整的html文档结构
        <h1>News Page</h1>
        <h3>标题:{{.title}}</h3>
        <p>内容:{{.content}}</p>
        
    • r.LoadHTMLGlob("tpls/*") 可配置在当前,也可配置在顶部,位置选其一
    • r.LoadHTMLFiles("tpls/news.html") 这个和上面二选一,但是这里使用逗号 , 分隔多个,可逐个指定
    • 这两个API在生产环境配置到顶部

Go搭建Web应用中实用的热更工具(辅助开发)

  • 工具1 fresh:https://github.com/gravityblast/fresh
    • 安装 $ go get github.com/pilu/fresh
    • 执行 $ fresh
    • 注意,这类全局工具,如果找不到命令
    • 请检查 $GOPATH, 并将 $GOPATH/bin 加入 $PATH
    • 别忘记 source 一下配置,如:$ source ~/.bash_profile
  • 工具2:https://github.com/codegangsta/gin
    • $ go install github.com/codegangsta/gin@latest
    • 执行 $ gin run main.go
  • 注意,两种安装的方式不同,官方指定不同的安装方式
    • 参考:https://blog.csdn.net/Tyro_java/article/details/135299131
  • 更推荐 fresh,更高效方便

相关文章:

  • wordpress外贸成品网站模板
  • 二叉树相关OJ题
  • Python编程中的异常处理
  • 利用Excel模拟投币试验
  • 简单试验:用Excel进行爬虫
  • 双活工作关于nacos注册中心的数据迁移
  • javaweb学习day03(JS+DOM)
  • python第六节:字典dict(2)
  • Pytorch卷积层原理和示例 nn.Conv1d卷积 nn.Conv2d卷积
  • 从零开始手写mmo游戏从框架到爆炸(十二)— 角色设定
  • 云计算基础-备份和容灾
  • 云计算基础-快照与克隆
  • AI怎么写作?如何利用AI写作?AI写作方式一定要学会
  • 如何使用python对基金投资收益进行回测
  • 【AIGC】Stable Diffusion的采样器入门
  • 【刷算法】求1+2+3+...+n
  • ES6--对象的扩展
  • EventListener原理
  • Git初体验
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js学习笔记
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • vue-cli在webpack的配置文件探究
  • 后端_ThinkPHP5
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • Mac 上flink的安装与启动
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法)前K大的和
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转载)hibernate缓存
  • ***监测系统的构建(chkrootkit )
  • ***检测工具之RKHunter AIDE
  • .bat文件调用java类的main方法
  • .net 获取url的方法
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NetCore 如何动态路由
  • .NET基础篇——反射的奥妙
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @font-face 用字体画图标
  • @Not - Empty-Null-Blank
  • @vue/cli脚手架
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android Pro] Notification的使用
  • [Android] 修改设备访问权限
  • [Android]使用Android打包Unity工程
  • [CLickhouse] 学习小计
  • [Codeforces] probabilities (R1600) Part.1
  • [codevs 1296] 营业额统计
  • [C语言]一维数组二维数组的大小