gin框架教程一: go框架gin的基本使用
gin框架教程代码地址:
我们在用http的时候一般都会用一些web框架来进行开发,gin就是这样的一个框架,它有哪些特点呢
一:gin特点
1、性能优秀
2、基于官方的net/http的有限封装
3、方便 灵活的中间件
4、数据绑定很强大
5、社区比较活跃
等等
二:gin的安装
安装:
go get github.com/gin-gonic/gin
如果要更新:
go get -u github.com/gin-gonic/gin
三:gin的使用
1、入门的第一个示例
先来写出一个例子:example1.go
- package main
- import (
- "github.com/gin-gonic/gin"
- )
- func main() {
- r := gin.Default()
- r.GET("/ping", func(c *gin.Context) {
- c.JSON(, gin.H{
- "message": "pong",
- })
- })
- r.Run() //listen and serve on 0.0.0.0:8080
- }
a. 然后运行 go run example1.go 之后,
b. 在浏览器上输入:http://localhost:8080/ping
输出结果:
{"message":"pong"}
2: gin的基本路由
- // 创建带有默认中间件的路由:
- r := gin.Default()
- //创建不带中间件的路由:
- //r := gin.New()
- r.GET("/someGet", getting)
- r.POST("/somePost", posting)
- r.PUT("/somePut", putting)
- r.DELETE("/someDelete", deleting)
- r.PATCH("/somePatch", patching)
- r.HEAD("/someHead", head)
- r.OPTIONS("/someOptions", options)
3、获取路由的参数
3.1 Parameters in path
编写param1.go文件
- package main
- import (
- "github.com/gin-gonic/gin"
- "net/http"
- )
- func main() {
- r := gin.Default()
- //这个能匹配 /user/tom , 但是不能匹配 /user/ 或 /user
- r.GET("/user/:name", func(c *gin.Context) {
- name := c.Param("name")
- c.String(http.StatusOK, "Hello %s", name)
- })
- //有一个方法可以匹配 /user/tom, 也可以匹配 /user/tom/send
- //如果没有任何了路由匹配 /user/tom, 它将会跳转到 /user/tom/
- r.GET("/user/:name/*action", func(c *gin.Context) {
- name := c.Param("name")
- action := c.Param("action")
- message := name + " is " + action
- c.String(http.StatusOK, message)
- })
- r.Run(":8080")
- }
a. 然后运行 go run param1.go 之后,
b. 在浏览器上输入:http://localhost:8080/user/tom
输出结果:Hello tom
c. 在浏览器上输入:http://localhost:8080/user/tom/
输出结果:tom is /
d. 在浏览器上输入:http://localhost:8080/user/tom/pig
输出结构: tom is /pig
3.2 query param
一般匹配这种形式的url /welcome?firstname=Jane&lastname=Doe
- package main
- //Querystring parameters
- import (
- "github.com/gin-gonic/gin"
- "net/http"
- )
- func main() {
- r := gin.Default()
- r.GET("/welcome", func(c *gin.Context) {
- firstname := c.DefaultQuery("firstname", "Guest") //如果没有值,还可以给一个默认值
- lastname := c.Query("lastname")
- c.String(http.StatusOK, "Hello %s %s ", firstname, lastname)
- })
- r.Run(":8080")
- }
a. 然后运行 go run param2.go 之后,
b. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy
输出结果:Hello Guest jimmy
c. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy&firstname=tom
输出结果:Hello tom jimmy
3.3 表单参数 Form
Multipart/Urlencoded Form
- package main
- import (
- "github.com/gin-gonic/gin"
- // "net/http"
- )
- func main() {
- r := gin.Default()
- r.POST("/form_post", func(c *gin.Context) {
- message := c.PostForm("message")
- nick := c.DefaultPostForm("nick", "guest")
- c.JSON(, gin.H{
- "status": "posted",
- "message": message,
- "nick": nick,
- })
- })
- r.Run(":8080")
- }
可以用postman来测试一下, 测试结果如下:
3.4 混合型的query + post form
- package main
- import (
- // "fmt"
- "github.com/gin-gonic/gin"
- )
- /*
- POST /post?id=1234&page=1 HTTP/1.1
- Content-Type: application/x-www-form-urlencoded
- name=manu&message=this_is_great
- */
- func main() {
- r := gin.Default()
- r.POST("/post", func(c *gin.Context) {
- id := c.Query("id")
- page := c.DefaultQuery("page", "")
- name := c.PostForm("name")
- message := c.PostForm("message")
- // fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
- c.JSON(, gin.H{
- "id": id,
- "page": page,
- "name": name,
- "message": message,
- })
- })
- r.Run(":8080")
- }
用postman测试结果如下:
4:解析数据绑定
我们可以给一个请求的数据绑定到一个类型,gin支持绑定的类型有JSON,XML和标准的表单数据(foo=bar&boo=baz)。 注意绑定时需要设置绑定类型的标签。比如绑定json数据时,
设置 json:"fieldname"
- package main
- import (
- "github.com/gin-gonic/gin"
- "net/http"
- )
- // Binding from JSON
- type User struct {
- Username string `form:"username" json:"username" binding:"required"`
- Password string `form:"password" json:"password" binding:"required"`
- Age int `form:"age" json:"age"`
- }
- func main() {
- r := gin.Default()
- // Example for binding JSON ({"username": "manu", "password": "123"})
- r.POST("/loginJSON", func(c *gin.Context) {
- var json User
- if err := c.ShouldBindJSON(&json); err == nil {
- if json.Username == "manu" && json.Password == "" {
- c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
- } else {
- c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized", "username": json.Username, "pass": json.Password})
- }
- } else {
- c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
- }
- })
- // Example for binding a HTML form (user=manu&password=123)
- r.POST("/loginForm", func(c *gin.Context) {
- var form User
- if err := c.ShouldBind(&form); err != nil {
- if form.Username == "manu" && form.Password == "" {
- c.JSON(http.StatusOK, gin.H{"status": "you are logged in 2"})
- } else {
- c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized 2"})
- }
- } else {
- c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
- }
- })
- r.Run(":8080")
- }
还有一些其他的应用,可以参考:
https://github.com/gin-gonic/gin/blob/master/README.md
gin框架教程一: go框架gin的基本使用的更多相关文章
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- revel框架教程之CSRF(跨站请求伪造)保护
revel框架教程之CSRF(跨站请求伪造)保护 CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山 ...
- Kail Linux渗透测试教程之Recon-NG框架
Kail Linux渗透测试教程之Recon-NG框架 信息收集 信息收集是网络攻击最重要的阶段之一.要想进行渗透攻击,就需要收集目标的各类信息.收集到的信息越多,攻击成功的概率也就越大.本章将介绍信 ...
- CRL快速开发框架系列教程一(Code First数据表不需再关心)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Cobalt Strike使用教程一
Cobalt Strike使用教程一 0x00 简介 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器.自3.0以后已经不在使用Metasploit框架而作为 ...
- gin源码解读2-揭开gin的神秘面纱
数据如何在gin中流转 func main() { gin.SetMode(gin.DebugMode) // 设置为开发模式 router := gin.Default() _ = router.S ...
- [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
- Linux驱动框架之framebuffer驱动框架
1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...
- [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法
本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...
随机推荐
- BZOJ 3876 统一下界上下界费用流
//Mcmf LargeDumpling #include<iostream> #include<cstdio> #include<cstdlib> #includ ...
- gson转换问题
list集合中integer问题 List<Integer> lists= gson.fromJson(params.get("lists"), new TypeTok ...
- linux yum的配置文件 repo文件详解
linux yum的配置文件 repo文件详解 什么是repo文件?repo文件是Fedora中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪 ...
- C#写入文件内容时提示:文件正被另一个人或程序使用
创建文件后未将文件关闭 string sTransLogFile = sTransLogPath + "\\" + DateTime.Now.ToString("yyyy ...
- CMD命令行基本命令
基本知识 输入 功能 Alt+Enter 全屏 Ctrl+S 暂停输出 Ctrl+C Ctrl+Break 停止程序 Ctrl+Z 表示输入结束 <file 从文件读标准输入 >file ...
- Java多线程和并发(九),ReentrantLock(公平锁)
目录 1.ReentrantLock 2.ReentrantLock的实现 3.synchronized和ReentrantLock的区别 九.ReentrantLock(公平锁) 1.Reentra ...
- Ueditor 从word中复制内容带多张图片
粘贴文本 注意,以下配置暂时对 IE 无效.IE 暂时使用系统自带的粘贴功能,没有样式过滤! 关闭粘贴样式的过滤 当从其他网页复制文本内容粘贴到编辑器中,编辑器会默认过滤掉复制文本中自带的样式,目的是 ...
- sh_11_字典的其他操作
sh_11_字典的其他操作 xiaoming_dict = {"name": "小明", "age": 18} # 1. 统计键值对数量 p ...
- react-router-dom 实现左侧导航
1.介绍react-router-dom https://reacttraining.com/react-router/web/example/basic 这个官网有很多栗子可以练手 1.1 Hash ...
- Unity3D_(游戏)双人3D坦克_简易版
双人3D坦克实现 player1: WSAD控制上下左右 空格键发射炮弹 player2: IKJL可控制上下左右 B键发射炮弹 每个坦克只有100hp,子弹击中1次扣30hp,hp时时显示在坦克上 ...