Gin框架入门(1)--路由搭建与Json处理

背景知识

为什么要使用Go框架

  1. 如果不使用框架,在创建服务器和调用端口时会遇到各种各样“奇怪”的问题(就是出错的排查方向可能达到十几种),而且这些问题很难有相似性。
  2. 同时作为适应于微服务的一门语言,代码的规范化和可读性随着框架的使用,会显著提高。

Gin框架学习配套

  1. 建议使用talend api tester进行路由查询,这样整个http报文的内容很清晰(在chrome浏览器中下载插件即可)
  2. 建议简要学习一下http协议的基础知识,报文,指令,响应码等
  3. 了解go的基本指令cd``````run``````build等,以及文件管理和包的声名
  4. 建议使用国内的镜像源(毕竟服务器这种,网络情况复杂,最好使用国内的)

环境搭建

  1. 使用下面的指令(如果编译器自动创建go.mod文件的话,就不用了):go mod init <项目名称>
  2. 使用以下指令获取gin包:go get -u github.com/gin-gonic/gin
  3. 如果正常的话,有一个go.mod文件和一个go.sum文件,可以简单查看其中有没有内容

路由

首先,常见的http请求有以下四种

  1. GET(获取)
  2. POST(上传)
  3. PUT(局部上传\更新)
  4. DELETE(删除)

实例

router包->router.go文件

package routerimport ("github.com/gin-gonic/gin""net/http"
)// 路由 函数的名字要大写,这样才可以被其他包访问!
func Router() *gin.Engine {//创建一个路由的实例r := gin.Default()//实现GET路由 获取r.GET("/hello", func(ctx *gin.Context) {ctx.String(http.StatusOK, "hello world")})//创建这样一个组,简化代码user := r.Group("/user"){user.POST("/list", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user list")})user.PUT("/add", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user update")})user.DELETE("/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user delete")})}return r
}

main.go文件

package mainimport "GinLearning/router"// 入口文件
func main() {r := router.Router()r.Run(":9999")
}

Json的实现

在前后端传输数据的时候,常用的方法就是使用Json格式,而在Gin框架中,想要创建使用Json文件传输只需要调用Json方法

直接实现

这种实现方法容易讲清楚实现的方式和包之间相互调用的原理。但是,由于Go语言管理函数的方式是<包名称>.<函数>,因此在一个包的不同文件中(可能是针对不同的对象),容易引起函数的重载。因此,可以先通过这个方法简单了解一下实现Json方法是如何调用的,之后再去看下一种常见的方法。

文件结构:

在这里插入图片描述

代码:

mian.go不变

User.go

package controllersimport "github.com/gin-gonic/gin"//实现关于用户的功能func GetUserInfo(c *gin.Context) {//ReturnSuccess(c *gin.Context, code int, msg interface{}, data interface{}, count int64)ReturnSuccess(c, 0, "Success", "UserInfo", 1)}func GetList(c *gin.Context) {//ReturnError(c *gin.Context, code int, msg string)ReturnError(c, 404, "没有相关信息")
}

common.go

package controllersimport ("github.com/gin-gonic/gin""net/http"
)type JsonStruct struct {Code  int         `json:"code"`Data  interface{} `json:"data"`Msg   interface{} `json:"msg"`Count int64       `json:"count"`
}type JsonErrStruct struct {Code int         `json:"code"`Msg  interface{} `json:"msg"`
}func ReturnSuccess(c *gin.Context, code int, msg interface{}, data interface{}, count int64) {//csde:响应码,msg:泛型信息,data:泛型数据,count:信息条数json := &JsonStruct{Code: code, Msg: msg, Data: data, Count: count}c.JSON(http.StatusOK, json)}func ReturnError(c *gin.Context, code int, msg string) {json := &JsonErrStruct{Code: code, Msg: msg}c.JSON(http.StatusOK, json)
}

router.go

package routerimport ("GinLearning/controllers""github.com/gin-gonic/gin""net/http"
)// 路由 函数的名字要大写,这样才可以被其他包访问!
func Router() *gin.Engine {//创建一个路由的实例r := gin.Default()//实现GET路由 获取r.GET("/hello", func(ctx *gin.Context) {ctx.String(http.StatusOK, "hello world")})//创建这样一个组,简化代码user := r.Group("/user"){user.GET("/info", controllers.GetUserInfo)user.POST("/list", controllers.GetList)user.PUT("/add", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user update")})user.DELETE("/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user delete")})}return r
}

实现方法:

mian.go入口
router.go路由
user.goJson响应的方法
common.go响应的信息

使用“类+方法”方式实现

只需要使用一个空的类,就可以把相同名称的函数变成不同类的方法

user.go

// 实现关于用户的功能
type UserController struct{}func (u UserController) GetUserInfo(c *gin.Context) {//ReturnSuccess(c *gin.Context, code int, msg interface{}, data interface{}, count int64)ReturnSuccess(c, 0, "Success", "UserInfo", 1)}func (u UserController) GetList(c *gin.Context) {//ReturnError(c *gin.Context, code int, msg string)ReturnError(c, 404, "没有相关信息User")
}

router.go分组对不同类进行管理

user := r.Group("/user"){user.GET("/info", controllers.UserController{}.GetUserInfo)user.POST("/list", controllers.UserController{}.GetList)user.PUT("/add", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user update")})user.DELETE("/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user delete")})}order := r.Group("/order"){order.GET("/list", controllers.OrderController{}.GetList)}

获取信息

使用 /传入信息

在这里插入图片描述

我们在user文件中实现

router.go

user.GET("/info/:id/:name", controllers.UserController{}.GetUserInfo)

user.go

使用Param方法获取

func (u UserController) GetUserInfo(c *gin.Context) {//ReturnSuccess(c *gin.Context, code int, msg interface{}, data interface{}, count int64)id := "用户的Id是:" + c.Param("id") + ""name := "用户的Name是:" + c.Param("name") + ""ReturnSuccess(c, 0, name, id, 1)
}

使用报文体(body)传入信息

我们在order文件中实现(这种方法的路由部分是不需要改动的)
在这里插入图片描述

order.go

package controllersimport "github.com/gin-gonic/gin"type OrderController struct{}func (o OrderController) GetList(c *gin.Context) {cid := c.PostForm("cid")name := c.DefaultPostForm("name", "未获取输入") //第二个参数是设置为获取输入输出的默认值ReturnSuccess(c, 0, cid, name, 1)
}

使用Json格式传入信息

在这里插入图片描述

gooduser文件中实现

type GoodUserController struct{}type Search struct {Cid  int    `json:"cid"` //前端传过来的小写Name string `json:"name"`
}func (p GoodUserController) GetList(c *gin.Context) {search := Search{}err := c.BindJSON(&search)if err != nil {ReturnError(c, 400, err.Error()) // 返回错误,状态码可以选择 400(Bad Request)return}ReturnSuccess(c, 0, search.Cid, search.Name, 1) // 仅在没有错误时返回成功
}func (p GoodUserController) GetList2(c *gin.Context) {param := make(map[string]interface{})err := c.BindJSON(&param)if err != nil {ReturnError(c, 400, err.Error())}ReturnSuccess(c, 0, param, param, 1)
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

构建高可用和高防御力的云服务架构第三部分:ECS集群(3/5)

ECS&#xff08;Elastic Compute Service&#xff09;是一种基础云计算服务&#xff0c;它提供了可伸缩的计算能力&#xff0c;允许用户在不需要预先购买硬件的情况下&#xff0c;根据需求快速扩展或缩减资源。ECS在云计算中的作用主要体现在提供虚拟化的服务器&#xff0c;用户…

食探秘:Spring Boot校园周边美食发现平台

第三章 系统设计 3.1 系统概要设计 本校园周边美食探索及分享平台选择B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式。适合在互联网上进行操作&#xff0c;只要用户能连网&#xff0c;任何时间、任何地点都可以进行系统的操作使用。系统工作原理图如图3-1所…

专业学习|动态规划(概念、模型特征、解题步骤及例题)

一、引言 &#xff08;一&#xff09;从斐波那契数列引入自底向上算法 &#xff08;1&#xff09;知识讲解 &#xff08;2&#xff09;matlap实现递归 &#xff08;3&#xff09;带有备忘录的遗传算法 &#xff08;4&#xff09;matlap实现带有备忘录的递归算法 “&#xff1…

linux入门介绍(通俗易懂,快速理解linux)

什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是管理和控制计算机硬件与软件资源的计算机程序&#xff0c;是配置在计算机硬件上的第一层软件&#xff0c;任何其它软件都必须在操作系统的支持下才能运行。 简单来说&#…

【LeetCode热题100】位运算

这篇博客先介绍了常见位运算操作&#xff0c;然后记录了关于位运算的几道题&#xff0c;包括判定字符是否唯一、丢失的数字、两整数之和、只出现一次的数字2、消失的两个数字。 在这一部分&#xff0c;我们不妨先来总结一下常见位运算操作&#xff1a; 1.基础位运算 >>…

fastadmin数据库创建说明文档

文章目录 数据库根据字段类型特殊字段以特殊字符结尾的规则注释说明 实例数字下拉列表日期时间文本框权重category_id --单选下拉框category_ids --多选下拉框deletetime --对应回收站status --对应tab常见问题 参考完结 数据库 这里提供的是数据库表字段规则在你创建表时使用…

Linux内核移植实战总结

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用&#xff0c;方便进一步记录自己的实践总结。 前两章我们简单了解了一下 Linux 内核顶层 Makefile 和 Linux 内核的启动流程&#xff0c;本章我们就来学习一下如何将 NXP官方提供的 Linux 内核移…

17.1ksm关注指标讲解 pod和node状态的统计

本节重点介绍 : 主要的应用 看状态数个数 根据13105大盘模板看ksm指标 节点指标pod和容器指标资源对象按namespace分布指标其他资源指标 主要的应用 看状态&#xff0c;举例图片数个数&#xff0c;举例图片 根据大盘模板 查看指标 https://grafana.com/grafana/dashboard…

Tomcat靶场攻略

一.CVE-2017-12615 1.首页抓包&#xff0c;修改为 PUT 方式提交 ,将jsp木马写到数据包中 2.哥斯拉默认秘钥连接 二.后台弱⼝令部署war包 1.制作WAR包,上传 将JSP⽊⻢压缩为ZIP格式&#xff0c;然后修改后缀为war 2.文件上传成功后&#xff0c;默认会在网站根目录下生成和wa…

Apache 中间件漏洞

CVE-2021-41773 环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid 访问172.16.1.4:8080 使⽤curl http://172.16.1.4:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

面向对象设计其他原则例题

答案&#xff1a;D 知识点&#xff1a; 面向对象设计其他原则 重用发布等价原则 重用的粒度就是发布的粒度 共同封闭原则 包中的所有类对于同一性质的变化应该是共同封闭的。一个变化若对一个包产生影响&#xff0c;则将对该包里的所有类产生影响&#xff0c;而对于其他的…

Fyne ( go跨平台GUI )中文文档-Fyne总览(二)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2​​​​​​​ 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne…

如何为 Java 应用程序创建安装程序

在 Java 中编写桌面应用程序时&#xff0c;我们总是希望其外观和感觉能够尽量贴近原生应用程序。因为一个优秀的应用程序应该要能融入其中&#xff0c;为用户提供已经熟悉的体验。 Swing GUI 的外观和感觉: Metal vs. Native 在桌面上&#xff0c;用户的使用旅程并不是从应用程…

什么是频谱泄露?

参考&#xff1a;https://www.bilibili.com/video/BV17a411j7bH/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 在理想情况下&#xff08;周期信号且时间无限&#xff09;&#xff0c;信号经过 FFT 后可以得到理想的频谱 但在现实…

【iOS】引用计数(一)

【iOS】引用计数 文章目录 【iOS】引用计数前言ARC与MRC什么是引用计数的机制内存管理的思考方式自己生成的对象非自己生成的对象不再需要自己持有就释放无法释放非自己持有的对象 autorelease小结 前言 笔者最近开始学习了一下有关于引用计数的内容&#xff0c;写这篇博客来简…

关于自动化测试的一点了解

一 自动化测试基础的认识 1)首先&#xff0c;什么是自动化测试&#xff1f; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实…

史上最全!!!大厂面试真题-SpringBoot自动装配的原理是什么?

我想你也在真实面试中被问过无数次这个问题了&#xff0c;我也是&#xff0c;但是不管你怎么搜&#xff0c;都只有那几篇八股文的答案&#xff0c;你问GPT它都解释不清楚&#xff0c;我决定自己写一篇详细的&#xff0c;避免遗忘也想帮助一下患难中的兄弟姐妹们&#xff0c;能把…

struct的精确用法

目录 我终于回来啦&#xff01; 1,可以创造根据结构体格式的成员或数组。 普通成员 数组成员 2,可以用指针遍历成员 3,使用typedef --------------------------------------------------------------------------------------------------------------------------------…

代码随想录Day 52|题目:101.孤岛的面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 图论part03题目一&#xff1a;101.孤岛的总面积解题思路DFS**BFS** 题目二&#xff1a;102. 沉没孤岛解题思路 题目三&#xff1a;103. 水流问题解题思路优化 题目四&#xff1a;104.建造最大岛屿…

[Linux]用户管理指令

开机/重启/登录/注销 进入xhsell 或者虚拟系统中, 右键桌面打开终端, 在终端执行命令, 重启或关机linux系统 建议使用普通账号登录, 如果权限不够时, 使用 su - 用户名 命令切换到超管, 然后再使用 logout命令退回到普通账号, logout 不能在图形界面的终端中使用 用户管理 Li…