Go语言中的gin框架之【GET/POST】请求参数接收传值(五)_gin get-程序员宅基地

技术标签: java  gin框架  golang  gin  

Gin中的get和post指的是HTTP请求中的不同方法。当客户端向服务器发起HTTP GET请求时,服务器会将相应的资源返回给客户端;当客户端向服务器发起HTTP POST请求时,服务器会将客户端发送的数据作为请求的一部分处理。

 

Gin是Go语言编写的一个Web框架,它支持HTTP GET和HTTP Post请求。通常情况下,HTTP GET用于请求数据或资源,而HTTP POST用于向服务器提交数据,比如Web表单。

在Gin中,我们可以使用GET方法来声明一个HTTP Get请求的处理器,例如以下代码:

package main

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

func main() {
    r := gin.Default()

    r.GET("/hello", func(c *gin.Context) {
        c.String(200, "Hello, Gin!")
    })

    r.Run() // 启动服务器
}

在上面的例子中,我们声明了一个HTTP Get请求的处理器,它的路由路径是“/hello”,当客户端向服务器发送“/hello”的GET请求时,则会执行此处理器。

这里的Get请求是在没有参数的情况下的一个案例,实际业务中可能有多样性的请求,所以,我们这里补充一下,在GET请求中还有一种类似于(localhost:8080/login?username="xiaomi"&password="123456")这样的访问url链接时候,在路由中如何取值呢?

也就是服务端如何接收 URL链接上参数?

在Gin中,可以使用Param或Query方法获取URL中的查询参数。Param方法可以获取路径参数,而Query方法可以获取查询参数。

例如:

package main

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

func main() {
    r := gin.Default()

    // /book/123  动态路由
    r.GET("/book/:id", func(c *gin.Context) {
        id := c.Param("id")
        c.String(200, "Book ID is "+id)
    })

    // /search?query=gin  路由携带参数
    r.GET("/search", func(c *gin.Context) {
        query := c.Query("query")
        c.String(200, "Search query is "+query)
    })

    r.Run()
}

在上面的例子中,我们使用Param方法获取路径参数,通过":id"来指定参数名,在处理器函数中使用c.Param(“id”)获取参数值,最后返回给客户端。我们也使用Query方法获取查询参数,使用"c.Query(“query”)"获取名为"query"的参数值,最后返回给客户端。 

这里我们需要注意的是 Param()Query()方法的首写字母都是大写, 同时,这两个方法都是

c *gin.Context】c对象的内置方法。

此外,我们也可以使用POST方法来声明一个HTTP Post请求的处理器,例如以下代码:

package main

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

func main() {
    r := gin.Default()

    r.POST("/login", func(c *gin.Context) {
        username := c.PostForm("username")
        password := c.PostForm("password")

        // 进行用户验证操作

        c.String(200, "登录成功!")
    })

    r.Run() // 启动服务器
}

在上面的例子中,我们声明了一个HTTP Post请求的处理器,它的路由路径是“/login”,当客户端向服务器发送“/login”的POST请求时,则会执行此处理器。在处理器中,我们可以通过c.PostForm方法获取客户端提交的表单数据,并进行相应的处理。

补充说明,在post请求模拟登录或者注册请求时候是结构体的数据,我们需要从请求c.request.body中获取到请求参数处理完成后,返回给客户端(这里不管是否成功与否的情况,这样的状态都一样要处理一下与实际开发环境一致)。如下案例:

package main

import (
	"net/http"

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

// 定义一个 userinfo 表单结构体对象
type UserInfo struct {
	UserName string `json:"username" form:"username"`
	Password string `json:"password" form:"password"`
	Age      string `json:"age" form:"age"`
}

func main() {
	// 定义一个路由引擎对象
	router := gin.Default()

	// 加载 渲染模板 全局
	router.LoadHTMLGlob("*templates/**/*")

	// 路由 get请求后 返回数据到模板渲染
	router.GET("/", func(c *gin.Context) {
		// c.JSON(200, gin.H{
		// 	"message": "Hello, world!",
		// })
		c.HTML(http.StatusOK, "login/index.html", gin.H{
			"title":   "登录页面",
			"content": "这是一个",
		})
	})

	// get请求 c.Query()方法获取url【/login?usename="小红"&password="123123"】 上的参数值:
	router.GET("/login", func(c *gin.Context) {
		username := c.Query("username")
		password := c.Query("password")
		// c.DefaultQuery()方法可以设定默认值,触发的条件是如果获取不到url上这个age参数的值,就返回约定的默认值18
		age := c.DefaultQuery("age", "18") // 18 is default value for login form auth form auth

		// 获取到url传入的参数跳转到 新的页面 首页 渲染到、default/index.html
		c.HTML(http.StatusOK, "default/index.html", gin.H{
			"name":     username,
			"password": password,
			"age":      age,
		})
	})

	// GET / 动态路由链接  /logout/1233 其中的1233是这个url上的动态变量值,默认取值就是uid
	router.GET("/logout/:uid", func(c *gin.Context) {
		uid := c.Param("uid") // 获取动态路由url链接上的变量值 /logout/1233 这里的值为1233
		status := "登出成功"
		// c.String(http.StatusOK, "uid=%v 状态=%v", uid, status)
		c.JSON(http.StatusOK, gin.H{
			"status": status,
			"uid":    uid,
		})
	})

	// 赋值结构体
	router.GET("/register", func(ctx *gin.Context) {
		// ctx.String(http.StatusOK,"成功!!")
		ctx.HTML(http.StatusOK, "register/index.html", gin.H{})

	})
	router.POST("/doAdd", func(ctx *gin.Context) {
		// post请求通过 c.PostForm()方法获取表单数据
		// username := ctx.PostForm("username")
		// password := ctx.PostForm("password")
		// age := ctx.DefaultPostForm("age", "20")
		// ctx.JSON(http.StatusOK, gin.H{
		// 	"username": username,
		// 	"password": password,
		// 	"age":      age,
		// })

		// post请求 通过  ctx.ShouldBind(&userInfo) 方法  结构体赋值
		userInfo := &UserInfo{}
		if err := ctx.ShouldBind(&userInfo); err == nil {
			ctx.JSON(http.StatusOK, gin.H{
				"userInfn": userInfo,
			})
		} else {
			ctx.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		}
	})

	router.Run(":8080")
}

其中html页面  default、login、register 文件夹等等只展示一下图片文件结构;

{
   {define "register/index.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册页面</title>
</head>
    <h1>{
   {"注册页面"}}</h1>
    <form action="/doAdd" method="post">
        用户名 <input type="text" name="username" id="username">
        密码 <input type="text" name="password" id="password">
        年龄  <input type="text" name="age" id="age">
        <input type="submit" value="提交">
    </form>
</body>
</html>
{
   {end}}

我们可以使用 ShouldBind 方法将请求中的数据绑定到结构体对象上。假设我们的请求体是 JSON 格式的数据,我们可以将它绑定到结构体对象上,步骤如下:

1.定义结构体

type User struct {
    Name     string `json:"name"`
    Age      int    `json:"age"`
    Password string `json:"password"`
}

2.使用 ShouldBind 方法

func handlePostRequest(c *gin.Context) {
    var user User
    if err := c.ShouldBind(&user); err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }
    c.JSON(http.StatusOK, gin.H{
        "name":     user.Name,
        "age":      user.Age,
        "password": user.Password,
    })
}

在上面的示例中,定义了一个结构体 User,表示请求体中的数据格式。然后使用 ShouldBind 方法将请求体的数据绑定到 User 对象中,并判断是否绑定失败。

ShouldBind 方法可以自动根据 Content-Type 的不同进行不同类型的绑定,支持 JSON、XML、Form 四种数据类型。需要注意的是,与使用 Bind 方法不同,如果使用 ShouldBind 方法失败,则不会抛出异常,而是返回错误对象。如果需要抛出异常,可以使用 ShouldBindJSON 或 ShouldBindXML 方法。

此外,还可以使用 ShouldBindUri 方法将 URL 中的数据绑定到结构体对象上。该方法与 ShouldBind 方法的用法类似。比如:

func handleGetRequest(c *gin.Context) {
    var user User
    if err := c.ShouldBindUri(&user); err != nil {
        c.AbortWithError(http.StatusBadRequest, err)
        return
    }
    c.JSON(http.StatusOK, gin.H{
        "name": user.Name,
        "age":  user.Age,
    })
}

在上面的示例中,我们使用 ShouldBindUri 方法将 URL 中的数据绑定到 User 对象中,然后返回 User 对象中的部分数据到客户端。

这里就贴出了最后关于简单注册的html代码其他可以移步到资源下载一下

以上就是使用Gin框架进行post和get请求的基本步骤。通过学习这些基础知识,可以进一步学习如何使用路由跳转等高级功能来满足更多实际需求。 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/A_LWIEUI_Learn/article/details/131221914

智能推荐

Word插件开发

创建一个新的 Office 插件项目:在 Visual Studio 中,选择"文件" -> “新建项目”,然后在模板中选择"Office/SharePoint",选择适当的 Office 插件项目模板,如 Word 插件、Excel 插件或 PowerPoint 插件。设计用户界面:在解决方案资源管理器中,打开你的插件项目,并在其中打开相应的 Office 文件(如 Word 文件、Excel 文件或 PowerPoint 文件)。你可以在 Office 应用中测试插件的功能,并在开发过程中进行调试。

便携式iv检测仪解析

在应用场景方面,便携式IV功率测试仪广泛应用于光伏电站的日常运维、光伏组件生产过程中的质量控制以及光伏项目的前期评估等环节。在光伏电站运维中,定期对光伏组件进行IV测试,可以及时发现性能下降或损坏的组件,为电站的运维提供有力支持。首先,从工作原理来看,光伏电站便携式IV功率测试仪通过模拟太阳光照射光伏组件,并测量组件在不同电压下的电流输出,从而绘制出IV曲线。此外,测试仪还可以计算光伏组件的功率输出、转换效率等参数,为用户提供全面的性能评估。

postgresql 索引之 hash_load_categories_hash postgres-程序员宅基地

文章浏览阅读3.6k次。os: ubuntu 16.04postgresql: 9.6.8ip 规划192.168.56.102 node2 postgresqlhelp create indexpostgres=# \h create indexCommand: CREATE INDEXDescription: define a new indexSyntax:CREATE [ UNIQUE ..._load_categories_hash postgres

face++实现人脸识别及人脸相似度对比_face++人脸识别 html5-程序员宅基地

文章浏览阅读4.8k次。使用face++,先获取key和secret下方是人脸识别,还添加了画出人脸轮廓的正方形下方是人脸识别,还添加了画出人脸轮廓的正方形 import requests#网络访问控件 from json import JSONDecoder#互联网数据交换标准格式 import cv2 as cv#图像处理控件 http_url =&amp;amp;amp;quot;https://a..._face++人脸识别 html5

desencrypt java md5_Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类-程序员宅基地

文章浏览阅读322次。很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了import java.io.IOException;import java.security.MessageDigest;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;im..._java desencrypt.encrypt(pass)

BZOJ 2818 欧拉函数,线性筛_线性筛预处理质数表, 并求出欧拉函数, 预处理前缀和即可 bzoj2818boj-程序员宅基地

文章浏览阅读145次。题目链接:https://www.acwing.com/problem/content/description/222/给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。GCD(x,y)即求x,y的最大公约数。输入格式输入一个整数N输出格式输出一个整数,表示满足条件的数对数量。数据范围1≤N≤10^7输入样例:4..._线性筛预处理质数表, 并求出欧拉函数, 预处理前缀和即可 bzoj2818boj

随便推点

【数据结构】静态表查找之顺序查找、二分查找、分块查找_读取表元是什么意思-程序员宅基地

文章浏览阅读4.1k次,点赞8次,收藏23次。​通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找。也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素。_读取表元是什么意思

如何设置交易滑点?精确到tick 测算期货冲击成本(附源码)_滑点设置多少合适-程序员宅基地

文章浏览阅读8.3k次,点赞4次,收藏18次。我们在非撮合回测模式下,因为无法获知交易价格当时的真实盘口价差、挂单数量,常主观设定一个滑点均值,比如针对螺纹钢等合约,设置 1 跳,针对某些交易不活跃的品种,设置 2 跳。但是这种近乎拍脑袋的方法并不精确。我们今天尝试通过简单的辅助工具,实现尽可能接近准确的 tick 级别滑点设置,代码已写好,不用编程也可获得结果。_滑点设置多少合适

大数据技术之 Azkaban_azkaban要建立job之间的依赖关系需要使用-程序员宅基地

文章浏览阅读551次。尚硅谷大数据技术之 Azkaban—————————————————————————————更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网尚硅谷大数据技术之 Azkaban(作者:尚硅谷大数据研发部)版本:V3.0一 概述1.1 什么是 AzkabanAzkaban 是由 Linkedin 公司推出的一个批量工作流任务调度器,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的 key:value 对的方式,通过配置中_azkaban要建立job之间的依赖关系需要使用

python批量修改文件编码格式,由utf-16 le 格式转为utf-8_utf16le转换utf8-程序员宅基地

文章浏览阅读5k次,点赞2次,收藏9次。#! python3# encoding: utf-8import osimport chardetdef strJudgeCode(str1): return chardet.detect(str1)"""def readFile(path): with open(path,'r',encoding='utf-16 le') as f: filecontent ..._utf16le转换utf8

android:AppWidget 窗口小部件的开发思想和Demo_安卓小部件开发demo-程序员宅基地

文章浏览阅读1.1k次。AppWidget 窗口小部件的开发思想和Demo  这篇文章讲一下android系统“窗口小部件”(也叫做,主屏幕部件)的开发过程。什么叫窗口小部件呢?是指在主屏幕上显示的独立视图(不过填充了数据)。这些视图的数据内容由后台进程顶起更新。要用到RemoteViews来显示部件,还要指派广播接收器更新这些RemoteViews. 既可以单独做个窗口小部件,也可在App中嵌入多个窗口小部_安卓小部件开发demo

接之前的SpringBoot项目通过金蝶中间件部署中未处理的问题_金蝶中间件部署项目-程序员宅基地

文章浏览阅读844次。接之前的SpringBoot项目通过金蝶中间件部署中未处理的问题新建的springboot项目是2.3.1的版本,打包到金蝶中部署就一直栈内存溢出后来把pom文件中的父依赖换成了2.2.4版本,打包部署到金蝶中就能运行了,我也不知道具体原因。如果有知道具体原因的请不吝赐教。..._金蝶中间件部署项目