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 main

import (
	"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 main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

var statusOK = http.StatusOK

func 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 main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

var statusOK = http.StatusOK

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	
	//配置路由
	r.GET("/", func(c *gin.Context) {
		c.String(statusOK, "Hello:%v", "gin")
	})
	// 访问示例:/user?id=3
	r.GET("/user", func(c *gin.Context) {
		id := c.Query("id")
		c.String(statusOK, "User: %s", id)
	})
	// 访问示例:/book/5
	r.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 main

import (
	"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.StatusOK

func 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,更高效方便

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/392788.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32 CubeMX】SPI HAL库编程

文章目录 前言一、CubeMX配置SPI Flash二、SPI HAL编程2.1 查询方式函数2.2 使用中断方式2.3 DMA方式 总结 前言 STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具&#xff0c;用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中&#xff0c;使用…

在Linux系统中设置HTTP隧道以实现网络穿透和端口转发

在数字化世界中&#xff0c;网络穿透和端口转发成为了许多开发者和系统管理员必备的技能。而在Linux系统中&#xff0c;通过设置HTTP隧道&#xff0c;我们可以轻松实现这一目标&#xff0c;让我们的服务即便在内网环境中也能被外部世界所访问。 那么&#xff0c;如何在Linux系…

idea 打不开项目 白屏

使用IDEA打开项目&#xff0c; 不知名原因崩溃了&#xff0c; 直接出现缩略图白屏。 解决过程&#xff1a; 尝试过重启IDEA&#xff0c;重启过电脑&#xff0c;重新引入相同项目&#xff08;使用不同路径&#xff0c;存在缓存记录&#xff0c;依然打不开&#xff09;&#xff…

磁盘删除的文件怎么恢复?4个简单方法(2024更新版)

“我有很多文件都保存在电脑磁盘里了&#xff0c;想问问电脑磁盘删除的文件有什么方法可以快速恢复吗&#xff1f;非常感谢大家&#xff01;” 在日常工作和生活中&#xff0c;我们经常会在磁盘中存储大量的文件。这些文件对我们来说或许都有特殊的意义。磁盘删除的文件怎么恢复…

C#,二进制数的按位旋转(Bits Rotate)算法与源代码

1 二进制数的按位旋转 二进制数的按位旋转&#xff08;翻转&#xff09;是编程中常见的按位运算方法。 二进制数的按位旋转分为左转、右转。 左转意味着数据变大&#xff0c;右转意味着数据变小&#xff08;有损&#xff09;。 2 源程序 using System; using System.Text; us…

TCP三次握手、四次挥手(简易版)

TCP是面向连接的&#xff1a;在真正通讯之前&#xff0c;必须先建立一条通讯线路&#xff0c;必须先完成连接。 TCP完成连接的过程&#xff1a;&#xff08;保证通讯线路畅通&#xff09; 建立连接&#xff1a; 三次握手基本过程 ①客户端首先向服务器发送一个建立连接的…

如何在亚马逊,美客多,阿里国际,速卖通上安全地进行自养号测评?

借鉴亚马逊等跨境电商市场的经验&#xff0c;我们建议选取具备以下特点的产品在平台上销售&#xff0c;以实现需求稳定、竞争较低、利润较高&#xff0c;同时规避法律纠纷和质检问题。首先&#xff0c;应选择体积小、重量轻、易于运输的商品&#xff0c;这有助于降低运输成本和…

Java 2:运算符、表达式和语句

2.1 运算符与表达式 Java提供了丰富的运算符&#xff0c;如算术运算符、关系运算符、逻辑运算符、位运算符等。Java语言中的绝大多数运算符和C语言相同&#xff0c;基本语句如条件分支语句&#xff0c;循环语句等&#xff0c;也和C语言类似。 2.1.1算术运算符与算术表达式 1…

vue打包优化,webpack的8大配置方案

vue-cli 生成的项目通常集成Webpack &#xff0c;在打包的时候&#xff0c;需要webpack来做一些事情。这里我们希望它可以压缩代码体积&#xff0c;提高运行效率。 文章目录 &#xff08;1&#xff09;代码压缩&#xff1a;&#xff08;2&#xff09;图片压缩&#xff1a;&…

计算机网络——17多路复用和解复用

多路复用和解复用 多路复用/解复用 在发送方主机多路复用 从多个套接字接收来自多个进程的报文&#xff0c;根据套接字对应的IP地址和端口号等信息对报文段用头部加以封装&#xff08;连头部信息用于以后的解复用&#xff09; 在接收方主机多路解复用 根据报文段的头部信息中…

揭秘铷原子钟:北斗卫星系统的“心脏”

揭秘铷原子钟&#xff1a;北斗卫星系统的“心脏” 近日&#xff0c;中国科学院精密测量科学与技术创新研究院的梅刚华团队发布了一项重要成果。他们成功将铷原子钟的短期频率稳定度提高到了E-14&#xff08;即10的负14次方&#xff0c;相当于百万亿分之一&#xff09;的量级&a…

七个常用的机器学习算法详解:决策树与随机森林的深入解析

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 在机器学习中&#xff0c;决策树和随机森林是两个非常常用的算法。它们都属于监督学习的…

Nginx学习笔记

Bilibili尚硅谷视频 Nginx 简介 Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 正向代理 正向代理&#xff1a;如…

Ditto:提升剪贴板体验的宝藏软件(复制粘贴效率翻倍、文本处理好助手)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是Ditto&#xff1f;二、下载安装三、如…

Tomcat要点总结

一、Tomcat 服务中部署 WEB 应用 1.什么是Web应用 &#xff08;1&#xff09; WEB 应用是多个 web 资源的集合。简单的说&#xff0c;可以把 web 应用理解为硬盘上的一个目录&#xff0c; 这个目录用于管理多个 web 资源。 &#xff08;2&#xff09;Web 应用通常也称之为…

多模态(三)--- BLIP原理与源码解读

1 BLIP简介 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 传统的Vision-Language Pre-training &#xff08;VLP&#xff09;任务大多是基于理解的任务或基于生成的任务&#xff0c;同时预训练数据多是从web获…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(7)特征工程的基本方法

今天来学习特征工程的基本方法。 基本方法包括&#xff1a;特征选择&#xff08;Feature Selection&#xff09;、特征提取&#xff08;Feature Extraction&#xff09;和特征构建&#xff08;Feature Construction&#xff09;。 一、特征选择&#xff08;Feature Selection&a…

智慧图书管理系统架构设计与实现

随着数字化时代的到来&#xff0c;智慧图书管理系统在图书馆和机构中扮演着重要的角色。一个优秀的图书管理系统不仅需要满足基本的借阅管理需求&#xff0c;还需要具备高效的性能、良好的扩展性和稳定的安全性。本文将讨论智慧图书管理系统的架构设计与实现&#xff0c;以满足…

shell脚本之高级变量

目录 一、高级变量赋值 1、高级变量赋值总结表 2、相关操作 二、变量间接引用 1、eval命令 一、高级变量赋值 1、高级变量赋值总结表 变量配置方式str 无配置str 为空字符串str 已配置为非空字符串var${str-expr}varexprvarvar$strvar${str:-expr}varexprvarexprvar$str…

GPT-4对编程开发的支持

在编程开发领域&#xff0c;GPT-4凭借其强大的自然语言理解和代码生成能力&#xff0c;能够深刻理解开发者的意图&#xff0c;并基于这些需求提供精准的编程指导和解决方案。对于开发者来说&#xff0c;GPT-4能够在代码片段生成、算法思路设计、模块构建和原型实现等方面给予开…