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

news2024/11/16 1:51:04

背景知识

为什么要使用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 router

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

import "GinLearning/router"

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

Json的实现

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

直接实现

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

文件结构:

在这里插入图片描述

代码:

mian.go不变

User.go

package controllers

import "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 controllers

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

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

import "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.coloradmin.cn/o/2155932.html

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

相关文章

【计算机组成原理】主存储器深度解析

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

基于SpringBoot+Vue的时尚美妆电商网站系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…

Windows下安装Neo4j流程

Neo4j简介 Neo4j 是一个基于图形结构的 NoSQL 数据库&#xff0c;专门用于存储和管理图数据。与传统的关系型数据库不同&#xff0c;Neo4j 使用 图&#xff08;graph&#xff09;的形式来表示数据&#xff0c;其中数据点&#xff08;称为 节点&#xff09;通过 边&#xff08;…

GUI编程19:贪吃蛇小游戏及GUI总结

视频链接&#xff1a;21、贪吃蛇之界面绘制_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p21&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.游戏中用的的图片素材 1.贪吃蛇游戏的主启动类StartGame&#xff1b; package com.yundait.snake;import j…

【ArcGISPro】配置模块

ArcGIS Pro 配置类似于加载项&#xff0c;但提供了扩展应用程序的其他方法。它可以帮助您设计更贴近您组织品牌和工作流的 ArcGIS Pro 版本。 托管配置是比 Add-in 更高级别的自定义。 配置可以提高加载项安全级别并添加非管理员指定的已知文件夹。 配置可以提供比插件更广泛…

全国832个贫困县名单及精准扶贫脱贫数据(2016-2020.11)

自党的十八大以来&#xff0c;通过全党全国各族人民的共同努力&#xff0c;中国成功实现了现行标准下9899万农村贫困人口的全部脱贫&#xff0c;832个贫困县全部摘帽。 摘帽名单 2016年-2020.11全国832个贫困县名单及精准扶贫脱贫数据整理&#xff08;大数据&#xff09;https…

图解 TCP 四次挥手|深度解析|为什么是四次|为什么要等2MSL

写在前面 今天我们来图解一下TCP的四次挥手、深度解析为什么是四次&#xff1f; 上一片文章我们已经介绍了TCP的三次握手 解析四次挥手 数据传输完毕之后&#xff0c;通信的双方都可释放连接。现在客户端A和服务端B都处于ESTABLISHED状态。 第一次挥手 客户端A的应用进…

笔尖划出秋季的声息

笔尖划出秋季的声息 进入秋分&#xff0c;天气渐趋凉爽&#xff0c;天空青蓝明朗&#xff0c;难言伤感。 九月&#xff0c;把一些句子记录好&#xff0c;明年拿出来晒一晒&#xff0c;秋季也就有了答案。 1、经历 9月6日&#xff0c;台风“摩羯”席卷而过粤西&#xff0c;…

尚品汇-秒杀商品定时任务存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…

STM32CSDK生成代码报错

STM32CubeMX not found 在使用STM32CSDK时报错 STM32CubeMX not found - ver. “5.2.0” or higher is required Download STM32CubeMx 解决方案 重新安装STM32CubeMX&#xff0c;选择为所有用户安装 MotorControl reference pack not found: 解决方案 1.选择合适的STM32…

Python语法(二)——函数

文章目录 函数语法格式函数参数链式调用嵌套调用函数递归变量作用域 函数 一段可以被重复使用的代码片段 求数列的和, 不使用函数 # 1.求1-100的和 sum 0 for i in range(1, 101):sum i print(fsum {sum})# 2.求300-400的和 sum 0 for i in range(300, 401):sum i print(…

为什么推荐使用英文版LabVIEW

在LabVIEW开发中&#xff0c;中文版和英文版主要在界面语言、功能习惯以及社区支持等方面存在差异。以下是两者的特点以及推荐使用英文版的原因&#xff1a; 中文版特点&#xff1a; 界面和帮助文档为中文&#xff1a;对于中文母语开发者来说&#xff0c;中文版LabVIEW的界面和…

在 Windows 11 中,可以通过修改注册表来更改系统的自动更新时间设置

regedit 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings FlightSettingsMaxPauseDays 36524

YOLOV8 OpenCV + usb 相机 实时识别

1 OpenCV 读相机 import cv2cap cv2.VideoCapture(0) while (1):# get a frameret, frame cap.read()# show a framecv2.imshow("capture", frame)if cv2.waitKey(1) & 0xFF ord(q):# cv2.imwrite("/opt/code/image/fangjian2.jpeg", frame)#passb…

设置CentOS7使用代理服务器上网

搭建代理 软件设置-参数设置-允许来自局域网的连接 软件设置-参数设置-为局域网开启新的端口(可选) 记录本机ip与端口号 配置系统代理 永久设置 # 编辑配置文件 vi /etc/profile# 在文件后添加以下内容&#xff1a; export http_proxyhttp://代理服务器IP:端口号 export h…

python - 子类为什么调用父类的方法

菜鸟教程 - 面向对象https://www.runoob.com/python3/python3-class.html为什么写这个呢 &#xff0c;因为很多时候&#xff0c;事情很简单&#xff0c;但我往往记住了使用方式&#xff0c;忘记了使用原因&#xff0c;也因为自己看到super()时&#xff0c;也想问为什么要用supe…

重生之我们在ES顶端相遇第16 章 - Lucene 写入流程

文章目录 前言写入流程图refreshRefresh 触发时机Translog FlushMerge 前言 上一章我们介绍了倒排索引的数据结构。 本章我们将深入介绍 Lucene 写入流程。 该知识点在面试中比较常问&#xff0c;也是理解 ES 必须掌握的知识点。 写入流程图 在第 14 章&#xff0c;我在介绍…

web基础—dvwa靶场(七)SQL Injection

SQL Injection&#xff08;SQL注入&#xff09; SQL Injection&#xff08;SQL注入&#xff09;&#xff0c;是指攻击者通过注入恶意的SQL命令&#xff0c;破坏SQL查询语句的结构&#xff0c;从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的&#xff0c;常常会导致…

有毒有害气体检测仪的应用和性能_鼎跃安全

随着现代工业的不断发展和扩张&#xff0c;越来越多的企业涉及到有毒有害气体的生产、使用和处理。工业规模的扩大导致有毒有害气体的排放量增加&#xff0c;同时也增加了气体泄漏的风险。在发生火灾、爆炸或危险化学品泄漏等紧急事件时&#xff0c;救援人员需要迅速了解现场的…

自动化立体仓库与堆垛机单元的技术参数

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是一份自动化立体仓库与堆垛机单…