gin基本使用

news2024/9/19 8:13:40

中文文档:https://gin-gonic.com/zh-cn/docs/

下载和安装gin模块

 go get -u github.com/gin-gonic/gin

简单接口demo

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{
    // 返回json数据
			"message": "hello golang",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
	//r.Run(":8081") // 自定义端口
}

浏览器访问:http://127.0.0.1:8080/ping

返回JSON格式数据

package main

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

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

	// gin.H 是map[string]interface{}的缩写
	r.GET("/someJSON", func(c *gin.Context) {
   
		// 方式一:自己拼接JSON
		c.JSON(http.StatusOK, gin.H{
   "message": "Hello world!"})
	})
	r.GET("/moreJSON", func(c *gin.Context) {
   
		// 方法二:使用结构体
		var msg struct {
   
			Name    string `json:"user"`
			Message string
			Age     int
		}
		msg.Name = "小王子"
		msg.Message = "Hello world!"
		msg.Age = 18
		c.JSON(http.StatusOK, msg)
	})
	r.Run(":8080")
}

浏览器访问:http://localhost:8080/someJSON,http://localhost:8080/moreJSON

获取参数

推荐一篇博主写的文章,很全,获取请求参数和绑定参数示例都是全的

获取querystring类型参数

package main

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

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

	r.GET("/user/search", func(c *gin.Context) {
   
		username := c.DefaultQuery("username", "小王子") // 没有username对应参数时默认小王子
		//username := c.Query("username")
		address := c.Query("address") // 获取address参数
		//输出json结果给调用方
		c.JSON(http.StatusOK, gin.H{
   
			"message":  "ok",
			"username": username,
			"address":  address,
		})
	})

	r.Run(":8080")
}

浏览器访问:http://localhost:8080/user/search?username=萧寂&address=河南省

获取form表单参数

package main

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

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

	r.POST("/user/search", func(c *gin.Context) {
   
		// DefaultPostForm取不到值时会返回指定的默认值
		//username := c.DefaultPostForm("username", "小王子")
		username := c.PostForm("username")
		address := c.PostForm("address")
		//输出json结果给调用方
		c.JSON(http.StatusOK, gin.H{
   
			"message":  "ok",
			"username": username,
			"address":  address,
		})
	})

	r.Run(":8080")
}

使用apiFox新建快捷请求,地址栏输入:http://localhost:8080/user/search,请求方式选择post,请求参数选择Body里面的form-data或者x-www-form-urlencoded,新增username字段,值为萧寂,address字段,值为河南省,点击发送请求即可

获取JSON参数

package main

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

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

	r.POST("/json", func(c *gin.Context) {
   
		// 注意:下面为了举例子方便,暂时忽略了错误处理
		b, _ := c.GetRawData() // 从c.Request.Body读取请求数据
		// 定义map或结构体
		var m map[string]interface{
   }
		// 反序列化
		_ = json.Unmarshal(b, &m)
		c.JSON(http.StatusOK, m)
	}

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

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

相关文章

【Android】【Compose】实现列表数据添加

序言 在使用列表的时候,以前是使用 Layout 布局里面添加Recyclerview进行列表的显示,但是在Compose里面,是没有这个Recyclerview使用的,那Compose怎么实现列表数据呢? 使用 【LazyColumn】 首先创建一个Compose项目…

java,深拷贝和浅拷贝

在 Java 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象拷贝的两种方式,主要区别在于它们如何处理对象的内部引用。 目录 一、浅拷贝(Shallow Copy) 实现方式 二、深拷贝&…

国际商城系统怎么弄 跨境电商商城怎样上线

国际商城系统一般涉及多个关键步骤。首先,需要选择合适的平台或开发工具,如商淘云国际电商系统或自定义开发。其次,系统应支持多语言、多币种以及国际支付网关,以满足全球客户的需求。第三,确保系统具有强大的物流和配…

推荐5款AI论文大纲生成器,一键极速生成!

在当今学术研究和写作领域,AI论文大纲生成器的出现极大地提高了写作效率和质量。以下是五款功能强大且全面的AI论文大纲生成器推荐: 一、千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和自然语言处理技术的AI写作助手,旨在帮助用户…

新160个crackme - 058-CZG-crackme1

运行分析 按下OK键后,程序退出 PE分析 C程序,32位,无壳 静态分析&动态调试 ida函数栏发现winMain(x,x,x,x),即打开窗口,双击函数跟进 继续跟进 双击DialogFunc函数,这个是窗口逻辑 继续跟进sub_401090函…

数据结构----栈和队列

(一)栈 1.栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First …

GFS 分布式文件系统 GlusterFS

一、GlusterFS概述 1.1、GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。 包括其去中心化(无元数据服务器)的特性,这有…

【苍穹外卖】总结

1 pom 依赖 1.1 MyBatis Spring 用于简化 MyBatis 与 Spring Boot 的集成,提供了对 MyBatis 框架的自动配置支持,简化了数据访问层的开发 1.2 Lombok Lombok 是一个 Java 库,能够通过注解自动生成常见的代码(如 getter、setter、…

双亲委派机制知识点

类加载器 双亲委派模型 为什么采用双亲委派模型 打破双亲委派机制的场景 Tomcat 打破双亲委派机制:目的是可以加载不同版本的jar包 实现类隔离:在Tomcat中,每个Web应用使用独立的类加载器加载类文件,这样做的好处在于,当在同一T…

C++二叉搜索树(二叉树进阶)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 C二叉搜索树(二叉树进阶) 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 二叉搜索树…

Java重修笔记 第五十七天 坦克大战(七)多线程基础 - 编程练习

1. 线程之间的协调控制(通知方式) public class Homework04 {public static void main(String[] args) {// 在 main 方法中启动两个线程// 第一个线程内循环打印 1 到 100 以内的整数// 直到第二个线程从键盘读取到 "Q" 指令后结束第一个线程…

Porcupine - 语音关键词唤醒引擎

文章目录 一、关于 Porcupine特点用例尝试一下 语言支持性能 二、Demo1、Python Demo2、iOS DemoBackgroundService DemoForegroundApp Demo 3、网页 Demo3.1 Vanilla JavaScript 和 HTML3.2 Vue Demos 三、SDK - Python 一、关于 Porcupine Porcupine 是一个高度准确和轻量级…

LC并联电路在正弦稳态下的传递函数推导(LC并联谐振选频电路)

LC并联电路在正弦稳态下的传递函数推导(LC并联谐振选频电路) 本文通过 1.解微分方程、2.阻抗模型两种方法推导 LC 并联选频电路在正弦稳态条件下的传递函数,并通过仿真验证不同频率时 vo(t) 与 vi(t) 的幅值相角的关系。 电路介绍 已知条件…

Axure RP实战:打造高效图形旋转验证码

Axure RP实战:打造高效图形旋转验证码 在数字产品设计的海洋中,验证码环节往往是用户交互体验的细微之处,却承载着验证用户身份的重要任务。 传统的文本验证码虽然简单直接,但随着用户需求的提高和设计趋势的发展,它…

vue2的diff算法

Vue2 的虚拟 DOM diff 算法是一种高效的算法,用于比较新旧两个虚拟 DOM 树,找出差异并更新到真实 DOM 上。这个算法的核心在于尽量减少不必要的 DOM 操作,提高性能。 虚拟dom:把DOM数据化,先通过不断地操作数据&#…

如何在手机端跑大模型?

最近新入手了一台 arm 开发板,内置安装了 Android 13 系统。 昨天把网络问题给解决了:安卓连接 WIFI 但无法上网?盘点踩过的那些坑 今日分享,继续带大家实操:如何把大模型(LLM)部署到移动端&a…

文章资讯职场话题网站源码整站资源自带2000+数据

介绍: 数据有点多,数据资源包比较大,压缩后还有250m左右。值钱的是数据,网站上传后直接可用,爽飞了 环境:NGINX1.18 mysql5.6 php7.2 代码下载

JUC学习笔记(三)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 八、共享模型之工具--JUC8.1 AQS 原理1. 概述2 实现不可重入锁自定义同步器自定义锁 3.心得起源目标设计1) state 设计2)阻塞恢复设计3)队列…

学习笔记 韩顺平 零基础30天学会Java(2024.9.16)

P563 自定义泛型方法 当调用方法时,要传入参数,因为当传入参数时,编译器就可以确定泛型代表的类型 泛型方法和方法使用了泛型是不一样的 泛型方法可以使用类声明的泛型,也可以使用自己的泛型 P564 泛型方法练习 P565 泛型的继承和…

Python编码系列—Python适配器模式:无缝集成的桥梁

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…