基本路由

httprouter路由库

点击查看代码
package main

import (
"fmt"
"github.com/julienschmidt/httprouter"
"net/http"
) func main() {
router := httprouter.New()
router.GET("/", index)
router.POST("/hello/:name/:age", hello)
http.ListenAndServe(":8080", router)
} func index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
fmt.Fprintln(w, "index页面")
}
func hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
// 请求地址:http://127.0.0.1:8080/hello/lisi/15
fmt.Println(ps, ps[0], ps[0].Key, ps[0].Value)
// 输出结果: [{name lisi} {age 15}] {name lisi} name lisi
fmt.Fprintf(w,"hello: %s: %s", ps.ByName("name"), ps.ByName("age"))
}
请求地址:http://127.0.0.1:8080/hello/lisi
返回结果:hello: lisi

参考链接

Restful风格的API

gin支持Restful风格的API

即Representational State Transfer的缩写。直接翻译的意思是"表现层状态转化",是一种互联网应用程序的API设计理念:URL定位资源,用HTTP描述操作

1.获取文章 /blog/getXxx Get blog/Xxx

2.添加 /blog/addXxx POST blog/Xxx

3.修改 /blog/updateXxx PUT blog/Xxx

4.删除 /blog/delXxxx DELETE blog/Xxx

API参数

  • 可以通过Context的Param方法来获取API参数
  • localhost:8000/xxx/zhangsan
type Hello struct {}
func (h *Hello) Register(router *gin.Engine) {
// 绑定路由规则执行的函数
router.GET("/hello/:score/*action", h.Hello)
}
func (h *Hello) Hello(context *gin.Context) {
// gin.Context里面封装了request和response
// 上下文是 gin 中最重要的部分。例如,它允许我们在中间件之间传递变量、管理流程、验证请求的 JSON 并呈现 JSON 响应。
context.JSON(http.StatusOK, gin.H{
"name": "zhang",
"age": 18,
"username": context.MustGet("username"),
"score": context.Param("score"),
// strings.Trim 截取
"action": strings.Trim(context.Param("action"), "/"),
})
}

URL参数

  • URL参数可以通过DefaultQuery()或Query()方法获取
  • DefaultQuery()若参数不村则,返回默认值,Query()若不存在,返回空串
  • API ? name=zs
type Hello struct {}
func (h *Hello) Register(router *gin.Engine) {
// 绑定路由规则执行的函数
router.GET("/hello", h.Hello)
}
func (h *Hello) Hello(context *gin.Context) {
// gin.Context里面封装了request和response
// 上下文是 gin 中最重要的部分。例如,它允许我们在中间件之间传递变量、管理流程、验证请求的 JSON 并呈现 JSON 响应。
context.JSON(http.StatusOK, gin.H{
"name": context.Query("name"),
"age": context.DefaultQuery("age", "18"),
})
}

表单参数

  • 表单传输为post请求,http常见的传输格式为四种:
  1. application/json
  2. application/x-www-form-urlencoded
  3. application/xml
  4. multipart/form-data
  • 表单参数可以通过PostForm()方法获取,该方法默认解析的是x-www-form-urlencoded或from-data格式的参数
func (h *Hello) Hello(context *gin.Context) {
// gin.Context里面封装了request和response
// 上下文是 gin 中最重要的部分。例如,它允许我们在中间件之间传递变量、管理流程、验证请求的 JSON 并呈现 JSON 响应。
context.JSON(http.StatusOK, gin.H{
"name": context.PostForm("name"),
"age": context.DefaultPostForm("age", "18"),
})
}

上传单个文件

  • multipart/form-data格式用于文件上传
  • gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中
type Hello struct {}
func (h *Hello) Register(router *gin.Engine) {
// 绑定路由规则执行的函数
router.POST("/file", h.Hello)
}
func (h *Hello) Hello(context *gin.Context) {
// gin.Context里面封装了request和response
// 上下文是 gin 中最重要的部分。例如,它允许我们在中间件之间传递变量、管理流程、验证请求的 JSON 并呈现 JSON 响应。
file, err := context.FormFile("file")
if err != nil {
fmt.Println(err)
context.String(http.StatusInternalServerError, "上传图片失败")
}
context.SaveUploadedFile(file, "./test/" + file.Filename)
context.String(http.StatusOK, file.Filename)
}

上传特定文件

有的用户上传文件需要限制上传文件的类型以及上传文件的大小,但是gin框架暂时没有这些函数(也有可能是我没找到),因此基于原生的函数写法自己写了一个可以限制大小以及文件类型的上传函数

点击查看代码
type Hello struct {}
func (h *Hello) Register(router *gin.Engine) {
// 绑定路由规则执行的函数
router.POST("/file", h.Hello)
}
func (h *Hello) Hello(context *gin.Context) {
file, err := context.FormFile("file")
if err != nil {
fmt.Println(err)
return
}
// 判断文件大小
if file.Size > 1024 * 1024 {
fmt.Println("文件太大了")
return
}
// 判断文件类型
if types := file.Header.Get("Content-Type"); types != "image/jpeg" {
fmt.Println("文件类型不对,不是image/jpeg类型")
return
}
context.SaveUploadedFile(file, "./test/" + file.Filename)
context.String(http.StatusOK, file.Filename)
}

上传多个文件

点击查看代码
type Hello struct {}
func (h *Hello) Register(router *gin.Engine) {
// 绑定路由规则执行的函数
router.POST("/file", h.Hello)
}
func (h *Hello) Hello(context *gin.Context) {
form , err := context.MultipartForm()
if err != nil {
fmt.Println(err)
return
}
// 获取所有图片
files := form.File["files"]
// 遍历所有图片
for _, file := range files {
// 逐个存
if err = context.SaveUploadedFile(file, "./test/" + file.Filename); err != nil {
fmt.Println(err)
return
}
}
context.String(http.StatusOK, fmt.Sprintf("upload ok %d files", len(files)))
}

routes group

routes group是为了管理一些相同的URL

  1. main.go
点击查看代码
package main

import (
"common_standard_library/controller"
"github.com/gin-gonic/gin"
) func main() {
// 创建路由
router := gin.Default() // 注册中间件
router.Use(setUserNameHandler) // 注册前台路由
front := router.Group("/front")
registerFrontRouter(front) // 注册后台路由
admin := router.Group("/admin")
registerAdminRouter(admin) router.Run()
} // 前台路由
func registerFrontRouter(router *gin.RouterGroup) {
// 注册index路由
new(controller.Index).Register(router)
} // 后台路由
func registerAdminRouter(router *gin.RouterGroup) {
// 注册hello路由
new(controller.Hello).Register(router)
} // 中间件设置变量
func setUserNameHandler(context *gin.Context) {
context.Set("username", "马亚南")
}

2. index.go

点击查看代码
package controller

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

type Index struct {}
func (i *Index) Register(router *gin.RouterGroup) {
router.GET("/index", i.index)
}
func (i *Index) index(context *gin.Context) {
context.JSON(200, "OK")
}
  1. hello.go
点击查看代码
package controller

import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
) type Hello struct {}
func (h *Hello) Register(router *gin.RouterGroup) {
// 绑定路由规则执行的函数
router.POST("/file", h.hello)
}
func (h *Hello) hello(context *gin.Context) {
form , err := context.MultipartForm()
if err != nil {
fmt.Println(err)
return
}
// 获取所有图片
files := form.File["files"]
// 遍历所有图片
for _, file := range files {
// 逐个存
if err = context.SaveUploadedFile(file, "./test/" + file.Filename); err != nil {
fmt.Println(err)
return
}
}
context.String(http.StatusOK, fmt.Sprintf("upload ok %d files", len(files)))
}

路由原理

  • httproter会将所有路由规则构造一颗前缀树
  • 例如有 root and as at cn com

gin框架中的路由的更多相关文章

  1. gin框架中请求路由组的使用

    1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...

  2. gin框架中的路由拆分与注册

    基本的路由注册 下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo. package main import ( "net/http" "gi ...

  3. Gin 框架 - 安装和路由配置

    目录 概述 Gin 安装 路由配置 推荐阅读 概述 看下 Gin 框架的官方介绍: Gin 是一个用 Go (Golang) 编写的 web 框架. 它是一个类似于 martini 但拥有更好性能的 ...

  4. 在gin框架中使用JWT

    在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...

  5. golang gin框架中实现一个简单的不是特别精确的秒级限流器

    起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...

  6. 【解决了一个小问题】gin框架中出现如下错误:"[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 500"

    POST到数据到一条gin框架的接口后,客户端收到400错误,并且返回了业务中返回的"decode json fail". 关键代码是: func report(c *gin.Co ...

  7. golang gin框架中实现大文件的流式上传

    一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...

  8. gin框架中中间件的编写与使用

    概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...

  9. gin框架中的参数验证

    结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else,会简洁许多. 处理请求方法 func structValidator(context *gin.Context) { var ...

随机推荐

  1. svn服务器用户名密码更改后,如何更新本地用户名密码

    在提交时,IDE会给出这样的提示,说明用户名密码已更改 在命令行输入 svn ls https:XXX(项目的地址),具体步骤如下图

  2. vscode 快速入门

    vscode 快速入门 本篇主要讲解 vscode 使用中的一些经验: 配置 vue 开发环境 - Vetur+ESLint+Prettier 代码片段的使用 常用插件 如何完全卸载 vscode 通 ...

  3. 【LeetCode】669. Trim a Binary Search Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...

  4. 【LeetCode】720. Longest Word in Dictionary 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力查找 排序 日期 题目地址:https://le ...

  5. 【LeetCode】481. Magical String 解题报告(Python)

    [LeetCode]481. Magical String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:/ ...

  6. Saliency maps

    目录 问题 细节 变量 扩展 代码 Deep Inside Convolutional Networks: Visualising Image Classification Models and Sal ...

  7. Proximal Algorithms 1 介绍

    目录 定义 解释 图形解释 梯度解释 一个简单的例子 Proximal Algorithms 定义 令\(f: \mathrm{R}^n \rightarrow \mathrm{R} \cup \{+ ...

  8. 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...

  9. Storm集群安装Version1.0.1开启Kerberos

    Storm集群安装,基于版本1.0.1, 同时开启Kerberos安全认证, 使用apache-storm-1.0.1.tar.gz安装包. 1.安装规划 角色规划 IP/机器名 安装软件 运行进程 ...

  10. Git 标签使用详解

    列出标签 # 默认按字母排序显示 $ git tag # 模糊匹配查找标签 $ git tag -l "v1.8.5*" 创建标签 # 创建附注标签 $ git tag -a v1 ...