返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言HttpRouter路由使用方法详解
  • 261
分享到

Go语言HttpRouter路由使用方法详解

2024-04-02 19:04:59 261人浏览 八月长安
摘要

HttpRouter是一个轻量级但却非常高效的multiplexer。手册: https://Godoc.org/GitHub.com/julienschmidt/httproute

HttpRouter是一个轻量级但却非常高效的multiplexer。手册:

https://Godoc.org/GitHub.com/julienschmidt/httprouter

https://github.com/julienschmidt/httprouter

用法示例

package main

import (
    "fmt"
    "github.com/julienschmidt/httprouter"
    "net/http"
    "log"
)

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    fmt.Fprint(w, "Welcome!\n")
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

func main() {
    router := httprouter.New()
    router.GET("/", Index)
    router.GET("/hello/:name", Hello)

    log.Fatal(http.ListenAndServe(":8080", router))
}

首先执行:

go get github.com/julienschmidt/httprouter

然后再启动WEB服务:

go run xxx.go

和http包的ServeMux用法其实很类似。上面定义了两个httprouter中的handle,类似于http包中的http.HandlerFunc类型,具体的对应关系后文会解释,只要认为它是handler,是处理对应请求的就行了。然后使用New()方法创建了实例,并使用GET()方法为两个模式注册了对应的handler。

需要注意的是,第二个模式"/hello/:name",它可以用来做命名匹配,类似于正则表达式的命名捕获分组。后面会详细解释用法。

httprouter用法说明

Variables
func CleanPath(p string) string
type Handle
type Param
type Params
	func ParamsFromContext(ctx context.Context) Params
	func (ps Params) ByName(name string) string
type Router
	func New() *Router
	func (r *Router) DELETE(path string, handle Handle)
	func (r *Router) GET(path string, handle Handle)
	func (r *Router) HEAD(path string, handle Handle)
	func (r *Router) Handle(method, path string, handle Handle)
	func (r *Router) Handler(method, path string, handler http.Handler)
	func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc)
	func (r *Router) Lookup(method, path string) (Handle, Params, bool)
	func (r *Router) OPTioNS(path string, handle Handle)
	func (r *Router) PATCH(path string, handle Handle)
	func (r *Router) POST(path string, handle Handle)
	func (r *Router) PUT(path string, handle Handle)
	func (r *Router) ServeFiles(path string, root http.FileSystem)
	func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)

type Handle

httprouter中的Handle类似于http.HandlerFunc,只不过它支持第三个参数Params。

type Handle func(http.ResponseWriter, *http.Request, Params)
    Handle is a function that can be reGIStered to a route to handle HTTP
    requests. Like http.HandlerFunc, but has a third parameter for the values of
    wildcards (variables).

例如前面示例中的Index()和Hello()都是Handle类型的实例。

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    fmt.Fprint(w, "Welcome!\n")
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

注册handler

httprouter.Router类型类似于http包中的ServeMux,它实现了http.Handler接口,所以它是一个http.Handler。它可以将请求分配给注册好的handler。

type Router struct {}
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request)

除此之外,Router提供了不少方法,用来指示如何为路径注册handler。

func (r *Router) Handle(method, path string, handle Handle)
func (r *Router) Handler(method, path string, handler http.Handler)
func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc)

httprouter.Handle()用于为路径注册指定的Handle,而httprouter.Handle对应于http.HandlerFunc,所以是直接将Handle类型的函数绑定到指定路径上。同时,它还可以指定http方法:GET, POST, HEAD, PUT, PATCH, DELETE, OPTIONS。

这些方法还有对应的各自缩写:

func (r *Router) DELETE(path string, handle Handle)
func (r *Router) GET(path string, handle Handle)
func (r *Router) HEAD(path string, handle Handle)
func (r *Router) OPTIONS(path string, handle Handle)
func (r *Router) PATCH(path string, handle Handle)
func (r *Router) POST(path string, handle Handle)
func (r *Router) PUT(path string, handle Handle)

例如,Get()等价于route.Handle("GET", path, handle)。

例如上面的示例中,为两个路径注册了各自的httprouter.Handle函数。

router := httprouter.New()
router.GET("/", Index)
router.GET("/hello/:name", Hello)

Handler()方法是直接为指定http方法和路径注册http.Handler;HandlerFunc()方法则是直接为指定http方法和路径注册http.HandlerFunc。

Param相关

type Param struct {
    Key   string
    Value string
}
Param is a single URL parameter, consisting of a key and a value.

type Params []Param
Params is a Param-slice, as returned by the router. The slice is ordered, the first URL parameter is also the first slice value. It is therefore safe to read values by the index.

func (ps Params) ByName(name string) string
ByName returns the value of the first Param which key matches the given name. If no matching Param is found, an empty string is returned.

Param类型是key/value型的结构,每个分组捕获到的值都会保存为此类型。正如前面的示例中:

router.GET("/hello/:name", Hello)

这里的:name就是key,当请求的URL路径为/hello/abc,则key对应的value为abc。也就是说保存了一个Param实例:

Param{
	Key: "name",
	Value: "abc",
}

更多的匹配用法稍后解释。

Params是Param的slice。也就是说,每个分组捕获到的key/value都存放在这个slice中。

ByName(str)方法可以根据Param的Key检索已经保存在slice中的Param的Value。正如示例中:

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

router.GET("/hello/:name", Hello)

这里ByName("name")将检索保存在slice中,Key="name"的Param,且返回这个Param中的Value。

由于Params是slice结构,除了ByName()方法可以检索key/value,通过slice的方法也可以直接检索:

ps[0].Key
ps[0].Value

路径匹配规则

httprouter要为路径注册handler的适合,路径可以进行命名捕获。有两种命名捕获的方式:

Syntax    Type
:name     named parameter
*name     catch-all parameter

其中:name的捕获方式是匹配内容直到下一个斜线或者路径的结尾。例如要为如下路径注册handler:

Path: /blog/:category/:post

当请求路径为:

/blog/go/request-routers            match: category="go", post="request-routers"
/blog/go/request-routers/           no match, but the router would redirect
/blog/go/                           no match
/blog/go/request-routers/comments   no match

*name的捕获方式是从指定位置开始(包含前缀"/")匹配到结尾:

Path: /files/*filepath

/files/                             match: filepath="/"
/files/LICENSE                      match: filepath="/LICENSE"
/files/templates/article.html       match: filepath="/templates/article.html"
/files                              no match, but the router would redirect

再解释下什么时候会进行重定向。在Router类型中,第一个字段控制尾随斜线的重定向操作:

type Router struct {
    RedirectTrailingSlash bool
	...
}

如果请求的URL路径包含或者不包含尾随斜线时,但在注册的路径上包含了或没有包含"/"的目标上定义了handler,但是会进行301重定向。简单地说,不管URL是否带尾随斜线,只要注册路径不存在,但在去掉尾随斜线或加上尾随斜线的路径上定义了handler,就会自动重定向。

例如注册路径为/foo,请求路径为/foo/,会重定向。

下面还有几种会重定向的情况:

注册路径:/blog/:category/:post
请求URL路径:/blog/go/request-routers/

注册路径:/blog/:category
请求URL路径:/blog/go

注册路径:/files/*filepath
请求URL路径:/files

Lookup()

func (r *Router) Lookup(method, path string) (Handle, Params, bool)

Lookup根据method+path检索对应的Handle,以及Params,并可以通过第三个返回值判断是否会进行重定向。

更多关于Go语言HttpRouter路由使用方法详解请查看下面的相关链接

您可能感兴趣的文档:

--结束END--

本文标题: Go语言HttpRouter路由使用方法详解

本文链接: https://lsjlt.com/news/146322.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言HttpRouter路由使用方法详解
    HttpRouter是一个轻量级但却非常高效的multiplexer。手册: https://godoc.org/github.com/julienschmidt/httproute...
    99+
    2024-04-02
  • Go语言中的路由实现方法
    Go语言中的路由实现方法,需要具体代码示例在Web应用程序中,路由通常用于确定客户端发出的请求应由哪个处理程序来处理。在Go语言中,有多种路由实现方法可供选择。下面将介绍其中三种常用的实现方法,并提供相应的代码示例:net/http包的路由...
    99+
    2023-12-17
    Go语言 路由 实现方法
  • 如何使用Go语言创建路由
    如何使用Go语言创建路由,需要具体代码示例在Go语言中,路由是Web开发中非常重要的一部分。它用于将HTTP请求映射到具体的处理函数,实现不同请求的处理和路由的管理。本文将介绍如何使用Go语言创建路由,并给出具体的代码示例。首先,我们需要导...
    99+
    2023-12-18
    Go语言 路由 创建
  • Go语言中rune方法使用详解
    Go语言中rune方法如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 1.byte类型 byt...
    99+
    2023-03-19
    Go语言rune方法 Go语言rune
  • Go语言中路由参数的处理方法
    Go语言中路由参数的处理方法在Web开发中,路由参数的处理是一项必须掌握的技能。在Go语言中,我们可以使用gorilla/mux包来处理路由参数,它是一个强大的路由库,提供了许多处理路由的方法。首先,让我们先来了解一下什么是路由参数。在We...
    99+
    2023-12-17
    ) Go语言 ) 路由参数 ) 处理方法
  • Go语言JSON解析器gjson使用方法详解
    目录gjson安装使用gjson GJSON 是一个Go包,它提供了一种从json文档中获取值的快速简单的方法。它具有单行检索、点符号路径、迭代和解析 json 行等功能。 还可以查...
    99+
    2022-12-08
    Go 解析器gjson Go JSON解析器
  • Go语言中函数的使用方法详解
    目录函数特点函数知识点函数的使用函数定义函数的参数函数的返回值函数的变量作用域函数的递归调用函数的可变参数函数的闭包函数的 defer 语句注意函数特点 函数可以有多个返回值。可以将...
    99+
    2023-05-18
    Go语言函数使用方法 Go语言函数使用 Go语言函数
  • Go语言中interface语法与使用详解
    目录初识interface基本语法其他注意事项interface底层实现ifaceeface侵入式与非侵入式的理解interface的应用场景类型转换实现多态功能补充:interfa...
    99+
    2024-04-02
  • Go语言多行注释的使用方法详解
    标题:Go语言多行注释的使用方法详解 Go语言是一种编译型语言,由谷歌开发,其简洁的语法和高效的性能受到广泛关注和喜爱。在Go语言中,注释是一种非常重要的编程元素,可以帮助程序员理解代...
    99+
    2024-04-02
  • Go语言函数方法调用详解
    标题:Go语言函数方法调用详解 Go语言作为一种快速、简单、高效的编程语言,其函数方法调用是其中一个重要的特性。本文将详细介绍Go语言中函数方法的调用方式,并提供具体的代码示例,帮助读...
    99+
    2024-04-02
  • Go语言元组的定义与使用方法详解
    Go语言元组的定义与使用方法详解 在编程语言中,元组是一种用于存储多个值的数据结构,元组中的值可以是不同类型的数据。在Go语言中,虽然没有内置的元组类型,但可以使用结构体或切片来模拟元...
    99+
    2024-04-02
  • Go语言变量的定义和使用方法详解
    Go语言变量的定义和使用方法详解 Go语言是一种静态类型的系统编程语言,它支持面向对象、过程式和函数式编程风格。在Go语言中,变量是用来存储数据的最基本的单元,它们可以存储各种数据类型...
    99+
    2024-04-02
  • Go语言中多行注释的使用方法详解
    珍惜时间,勤奋学习!今天给大家带来《Go语言中多行注释的使用方法详解》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希...
    99+
    2024-04-04
  • 详解vue中路由的安装和使用方法
    Vue 是一款流行的前端开发框架,它提供了诸多方便开发的工具和功能。其中,Vue 路由能够帮助我们创建单页应用程序,并且帮助我们实现路由功能。本篇文章将会介绍 Vue 路由的使用。Vue路由安装在开始使用 Vue 路由之前,我们需要先安装 ...
    99+
    2023-05-14
  • Go语言中sync.Cond使用详解
    目录sync.Cond 可以用来干什么? 与 Sync.Mutex 的区别 sync.Cond 使用场景 sync.Cond sync.Cond 有哪些方法 NewCond 创建实例...
    99+
    2024-04-02
  • Go语言os包用法详解
    目录os 包中的常用函数os/exec 执行外部命令os/user 获取当前用户信息os/signal 信号处理Go语言的 os 包中提供了操作系统函数的接口,是一个比较重要的包。顾...
    99+
    2023-05-14
    Go语言os包 Go os包使用
  • Go语言指针用法详解
    结合这个例子分析一下 结果: 结合以往C语言的基础,画了一张图来解释为什么会有上面这些值的出现。先查看下Go中的这两个运算符是啥吧。 ①对于所有带a的结果 var a int ...
    99+
    2024-04-02
  • Go语言类方法和对象方法详解
    go语言中,类方法(type)作用于整个结构体类型,用于执行不操作具体实例的操作。对象方法(receiver)绑定到具体实例,用于操作实例数据。实战案例中,类方法用于创建和获取员工信息,...
    99+
    2024-04-03
    方法 go语言
  • Go语言学习之结构体和方法使用详解
    目录1. 结构体别名定义2. 工厂模式3. Tag 原信息4. 匿名字段5. 方法1. 结构体别名定义 变量别名定义 package main import "fmt" type...
    99+
    2024-04-02
  • Flutter使用pushpop方法及路由进行导航详解
    目录正文准备工作第一种导航方式第二种导航方式正文 在 Web/Mobile 应用程序中,导航是一个很重要的特性,因为它允许你从一个页面跳转到另一个页面。 在 flutter 应用程序...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作