GoWeb开发框架gin-基础路由使用

news2024/11/15 19:25:18

文章目录

  • 1.安装并写一个demo
  • 2.配置GoLang热加载脚手架
  • 3.配合net/http使用完整示例
  • 4.返回值
    • 4.1String返回值
    • 4.2Json返回值
    • 4.3struct结构体返回值
    • 4.4jsonp返回值
    • 4.5XML返回值
  • 5.接收前端传过来的参数
    • 5.1get请求传值
    • 5.2form表单传值
    • 5.3接收结构体
    • 5.4路由地址传参
  • 6.完整代码

1.安装并写一个demo

https://gin-gonic.com/zh-cn/docs/quickstart/
跟着官网上边一步一步的安装,在这里我遇上了go proxy的问题可以参考我之前写的
https://blog.csdn.net/zhaohan___/article/details/134272057?spm=1001.2014.3001.5501
对照一下改一下环境变量修改proxy

完成之后的的代码
在这里插入图片描述

package main

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

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
       c.JSON(200, gin.H{
          "message": "pong",
       })
    })
    r.Run() // 默认监听并在 0.0.0.0:8080 上启动服务
}

界面get请求如下图
在这里插入图片描述

2.配置GoLang热加载脚手架

官方地址:https://github.com/gravityblast/fresh

go get github.com/pilu/fresh

然后在这里需要配一下环境变量GoPath下载下来的包的环境变量,直接添加到系统的Path里
在这里插入图片描述
然后在cmd切换到你的工作目录执行

fresh

出现如下界面就算成功了
在这里插入图片描述

3.配合net/http使用完整示例

package main

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

func main() {
    // 创建一个默认的路由引擎
    r := gin.Default()
    // 配置路由
    r.GET("/ping", func(c *gin.Context) {
       // 路由被请求时的返回结果
       c.JSON(http.StatusOK, gin.H{
          "message": "pong",
       })
    })
    r.Run(":10000") // 监听并在 0.0.0.0:10000 上启动服务
}

4.返回值

4.1String返回值

r.GET("/string", func(c *gin.Context) {
    // String数据返回两个参数第一个是状态码,第二个是格式化后的值,第三个是返回值。注意%V占位符是指将后边的values拼接到前边的占位符位置
    c.String(http.StatusOK, "值:%v", "调用一次500元!")
})

4.2Json返回值

r.GET("/json", func(c *gin.Context) {
    // Json数据返回两个参数第一个是状态码,第二个是返回值,这里自动会装配成json返回
    c.JSON(http.StatusOK, gin.H{
       "success": true,
       "message": "json",
    })
})

4.3struct结构体返回值

r.GET("/struct", func(c *gin.Context) {
    // Json数据返回两个参数第一个是状态码,第二个是返回值,本次返回结构体,这里自动会装配成json返回
    returnData := &User{
       Name: "chrise warner",
       Age:  18,
    }
    c.JSON(http.StatusOK, returnData)
})

4.4jsonp返回值

通常适用于前端跨域请求,需要执行前端回调函数

r.GET("/jsonp", func(c *gin.Context) {
    // Json数据返回两个参数第一个是状态码,第二个是返回值,本次返回结构体,这里自动会装配成json返回
    returnData := &User{
       Name: "chrise warner",
       Age:  18,
    }
    c.JSONP(http.StatusOK, returnData)
})

4.5XML返回值

r.GET("/xml", func(c *gin.Context) {
    // Json数据返回两个参数第一个是状态码,第二个是返回值,本次返回结构体,这里自动会装配成json返回
    returnData := &User{
       Name: "chrise warner",
       Age:  18,
    }
    c.XML(http.StatusOK, returnData)
})

5.接收前端传过来的参数

5.1get请求传值

r.GET("/string", func(c *gin.Context) {
    // 接受请求参数
    userName := c.Query("userName")
    age := c.Query("age")
    limit := c.DefaultQuery("limit", "1")
    fmt.Println("后端接收参数" + userName)
    fmt.Println("后端接收参数" + age)
    fmt.Println("后端接收参数" + limit)
    // String数据返回两个参数第一个是状态码,第二个是格式化后的值,第三个是返回值。注意%V占位符是指将后边的values拼接到前边的占位符位置
    c.String(http.StatusOK, "值:%v", "调用一次500元!")
})

5.2form表单传值

// 从form表单中获取值
r.POST("/form", func(c *gin.Context) {
    // 获取form表单中的数据
    userName := c.PostForm("userName")
    age := c.PostForm("age")
    limit := c.DefaultPostForm("limit", "1")
    c.JSON(http.StatusOK, gin.H{
       "userName": userName,
       "age":      age,
       "limit":    limit,
    })
})

5.3接收结构体

首先需要对结构体增加配置,指明自动注入并且修改注入时名称

type User struct {
    Name string `json:"name" binding:"required"` // 后边是json格式化时使用的名
    Age  int    `json:"age" binding:"required"`
}

然后编写结构体接收

// 用结构体接收数据
r.POST("/struct/auto", func(c *gin.Context) {
    // 获取form表单中的数据
    var user User
    if err := c.ShouldBindJSON(&user); err == nil {
       fmt.Println("后端接收参数" + "!" + user.Name)
       c.JSON(http.StatusOK, user)
    } else {
       c.JSON(http.StatusOK, gin.H{
          "err": err.Error(),
       })
    }
})

5.4路由地址传参

// 路由地址传参
r.POST("/struct/auto/:name", func(c *gin.Context) {
    // 获取form表单中的数据
    name := c.Param("name")
    c.JSON(http.StatusOK, gin.H{
       "success": true,
       "message": name,
    })
})

6.完整代码

package main

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

type User struct {
    Name string `json:"name" binding:"required"` // 后边是json格式化时使用的名
    Age  int    `json:"age" binding:"required"`
}

func main() {
    // 创建一个默认的路由引擎,并且定义路由被请求时的返回结果
    r := gin.Default()
    // string返回值
    r.GET("/string", func(c *gin.Context) {
       // 接受请求参数
       userName := c.Query("userName")
       age := c.Query("age")
       limit := c.DefaultQuery("limit", "1")
       fmt.Println("后端接收参数" + userName)
       fmt.Println("后端接收参数" + age)
       fmt.Println("后端接收参数" + limit)
       // String数据返回两个参数第一个是状态码,第二个是格式化后的值,第三个是返回值。注意%V占位符是指将后边的values拼接到前边的占位符位置
       c.String(http.StatusOK, "值:%v", "调用一次500元!")
    })
    // json返回值
    r.GET("/json", func(c *gin.Context) {
       // Json数据返回两个参数第一个是状态码,第二个是返回值,这里自动会装配成json返回
       c.JSON(http.StatusOK, gin.H{
          "success": true,
          "message": "json",
       })
    })
    // struct返回值
    r.GET("/struct", func(c *gin.Context) {
       // Json数据返回两个参数第一个是状态码,第二个是返回值,本次返回结构体,这里自动会装配成json返回
       returnData := &User{
          Name: "chrise warner",
          Age:  18,
       }
       c.JSON(http.StatusOK, returnData)
    })
    // JSONP返回值
    r.GET("/jsonp", func(c *gin.Context) {
       // Json数据返回两个参数第一个是状态码,第二个是返回值,本次返回结构体,这里自动会装配成json返回
       returnData := &User{
          Name: "chrise warner",
          Age:  18,
       }
       c.JSONP(http.StatusOK, returnData)
    })
    // XML返回值
    r.GET("/xml", func(c *gin.Context) {
       // Json数据返回两个参数第一个是状态码,第二个是返回值,本次返回结构体,这里自动会装配成json返回
       returnData := &User{
          Name: "chrise warner",
          Age:  18,
       }
       c.XML(http.StatusOK, returnData)
    })
    // 从form表单中获取值
    r.POST("/form", func(c *gin.Context) {
       // 获取form表单中的数据
       userName := c.PostForm("userName")
       age := c.PostForm("age")
       limit := c.DefaultPostForm("limit", "1")
       c.JSON(http.StatusOK, gin.H{
          "userName": userName,
          "age":      age,
          "limit": 

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

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

相关文章

nodejs+vue+微信小程序+python+PHP基于spark的酒店管理系统-计算机毕业设计推荐

通过管理系统进行全面的线上管理。管理者可以通过基于spark的酒店管理系统,全面掌握酒店客房的各项状态,会员通过系统查询酒店客房信息,在线预定。 酒店作为旅游过程必须的设施,也逐渐需需要进行信息化管理,把酒店类型…

python 爬虫 m3u8 视频文件 加密解密 整合mp4

文章目录 一、完整代码二、视频分析1. 认识m3u8文件2. 获取密钥,构建解密器3. 下载ts文件4. 合并ts文件为mp4 三、总结 一、完整代码 完整代码如下: import requests import re import os from tqdm import tqdm from Crypto.Cipher import AES# 创建临…

油田中控室与32台碳储罐之间数据无线传输

二氧化碳强化石油开采技术,须先深入了解石油储层的地质特征和二氧化碳的作用机制。现场有8辆二氧化碳罐装车,每辆罐车上有4台液态二氧化碳储罐,每台罐的尾部都装有一台西门子S7-200 smart PLC。在注入二氧化碳的过程中,中控室S7-1…

json.loads和eval 速度对比

json.loads和eval 速度对比 代码1结果图代码2参考地址 代码1 import json import time import pandas as pddata_sets pd.read_pickle("val_token_id.pandas_pickle") data_sets[str(i) for i in data_sets] starttime.time() [json.loads(i) for i in data_sets] …

企业使用APP自动化测试工具的重要因素

随着移动应用市场的蓬勃发展,企业对高质量、高效率的软件交付提出了更高的要求。在这个背景下,APP自动化测试工具成为了企业不可或缺的一部分。以下是企业采用APP自动化测试工具的关键因素: 1. 快速且可重复的测试执行 自动化测试工具能够快速…

好看的早上问候语早安图片,今天最新唯美温馨祝福语

1、天气冷了,情谊不凉,树叶黄了,思念不忘,问候像一杯热茶,让人暖心!祝愿我们与健康平安同行!朋友们,大家早上好! 2、多一个人牵挂是一种幸福;多一个人相知是一…

【分治】循环赛日程表Python实现

文章目录 [toc]问题描述分治算法示例Python实现 无运动员数量约束循环赛日程表算法示例Python实现 问题描述 设有 n 2 k n 2^{k} n2k个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表 每个选手必须与其他 n − 1 n - 1 n−1个选手各赛一次每个选手一天…

vue elementui点击按钮新增输入框(点多少次就新增多少个输入框,无限新增)

效果如图&#xff1a; 核心代码&#xff1a; <div v-for"(item,index) in arrayData" :key"item.id">//上面这个是关键代码&#xff0c;所有思路靠这个打通<el-inputtype"input" //除了输入框&#xff0c;还有textarea等placeholder&…

编程实战:自己编写HTTP服务器(系列5:执行后台命令)

系列入口&#xff1a;编程实战&#xff1a;自己编写HTTP服务器&#xff08;系列1&#xff1a;概述和应答&#xff09;-CSDN博客 本文介绍执行后台命令的shell.asp的实现。 目录 一、概述 二、主体代码 三、详解 3.1 参数 一、概述 这个功能就相当于一个终端&#xff0c;不…

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c 鸿鹄云商

鸿鹄云商 SAAS云产品概述 【SAAS云平台】打造全行业全渠道全场景的SaaS产品&#xff0c;为店铺经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多…

MySQL:从MySQL看主从架构高可用性实现

目录 1 主备延迟 1.1 主备延迟 1.2 主备延迟的来源 1.2.1 主备机性能有差距 1.2.2 备库压力大 1.2.3 大事务 1.3 主备延迟的排查思路 3&#xff09;查看MySQL状态 2 主备切换策略 2.1 可靠性优先策略 2.2 可用性优先策略 2.3 常见切换技术 从进入互联网时代开始&a…

Linux之进程(三)(环境变量)

目录 一、基本概念 二、环境变量 1、PATH 2、HOME 3、SHELL 三、环境变量参数 四、argc和argv 一、基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。如&#xff1a;临时文件夹位置和系统文件夹位置等。环境变量通常…

【软考】信息系统项目管理师论文方向猜想

报喜不报忧&#xff0c;每天都在为鸡零狗碎推诿扯皮&#xff0c;属实是有辱师门。 通过软考&#xff0c;目前算是真正有意义的事情。 虽然都说高项的论文是个玄学&#xff0c;但是道听途说了一些通关感想还是蛮有启发的。 文件要求 参考了一份广西省高级工程师评审的文件&am…

【C语言】二分查找(详解)

&#x1f3a5; 岁月失语唯石能言的个人主页 &#x1f525;个人栏专&#xff1a;秒懂C语言 ⭐若在许我少年时&#xff0c;一两黄金一两风 一、二分查找的思路 二分查找也叫折半查找&#xff0c;二分查找针对的是一个有序的数据集合&#xff0c;每次都通过跟区间的…

C# 图解教程 第5版 —— 第18章 泛型

文章目录 18.1 什么是泛型18.2 C# 中的泛型18.3 泛型类18.3.1 声明泛型类18.3.2 创建构造类型18.3.3 创建变量和实例18.3.4 使用泛型的示例18.3.5 比较泛型和非泛型栈 18.4 类型参数的约束18.4.1 Where 子句18.4.2 约束类型和次序 18.5 泛型方法18.5.1 声明泛型方法18.5.2 调用…

宿舍智能电能表预付费系统的费控策略及应用

安科瑞电气股份有限公司 上海嘉定 201801 摘要:基于智能电能表的预付费系统平台可以实现对预付费客户的适时算费、远程费控和服务。预付费系统的费控策略包括算费子策略、催费预警提醒子策略、欠费停电子策略,介绍3个子策略的制定原则、设计流程,并以示例说明策略的实现方式,通…

每日一博 - Cache Miss Attack

文章目录 概述解决思路缓存空值键并设置短期 TTL&#xff08;生存时间&#xff09;使用布隆过滤器 伪代码1. 缓存空值键并设置短期 TTLa. 缓存空值键b. 设置短期 TTL 2. 使用布隆过滤器a. 集成布隆过滤器b. 查询布隆过滤器 进一步优化系统性能的建议 概述 在缓存管理中&#x…

(C++)VS下sizeof(string(““))与linux-g++下sizeof(string(““))大小区别及原因剖析

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 说明 博主是x86平台&#xff0c;所以下面的结果是28&#xff1b;x64平台下是40&#xff0c;size_t变了&#xff0c;由int变long long。 接下来我们先来介绍 vs 下string的数据结构 我们可以看到有一个_Buf数组&#xff0c;…

【IDEA】反向撤销操作快捷键 ctrl+shift+z 和搜狗热键冲突的解决办法

当我们执行某些操作时与搜狗热键冲突&#xff0c;直接取消搜狗的快捷键即可&#xff01;&#xff01;&#xff01;以下以 ctrlshiftz 为例。 在输入悬浮框右键找到更多设置 按键里面找到系统功能快捷键设置 取消掉冲突的热键即可

Word插件-好用的插件-PPT 素材该怎么积累-大珩助手

PPT 素材该怎么积累&#xff1f; 使用大珩助手中的素材库功能&#xff0c;将Word中的&#xff0c;或系统中的文本文件、图片、其他word文档、pdf&#xff0c;所有见到的好素材&#xff0c;一键收纳。 步骤&#xff1a;选中文件&#xff0c;按住鼠标左键拖到素材库界面中&…