issue9/mux

功能完备的 Go 路由器
授权协议 MIT
开发语言 Google Go
所属分类 服务器软件、 路由器/防火墙
软件类型 开源软件
地区 国产
投 递 者 顾宣
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

通过范型功能,可以很方便地实现一个自定义的路由:

type Context struct {
	R *http.Request
	W http.ResponseWriter
	P Params
}

type HandlerFunc func(ctx *Context)

type Router = RouterOf[HandlerFunc]
type Prefix = PrefixOf[HandlerFunc]
type Resource = ResourceOf[HandlerFunc]
type MiddlewareFunc = MiddlewareFuncOf[HandlerFunc]
type Middleware = MiddlewareOf[HandlerFunc]
type Options = OptionsOf[HandlerFunc]

func New(name string, ms []Middleware, o ...Option)* Router {
	f := func(w http.ResponseWriter, r *http.Request, ps Params, h HandlerFunc) {
		ctx := &Context {
			R: r,
			W: w,
			P: ps,
		}
		h(ctx)
	}
	return NewRouterOf[HandlerFunc](name, f, ms, o...)
}

// 以上就是自定义路由的全部功能,之后就可以直接使用:

r := New("router", nil)

r.Get("/path", func(ctx *Context){
	// TODO
	ctx.W.WriteHeader(200)
})

r.Prefix("/admin").Get("/login", func(ctx *Context){
	// TODO
	ctx.W.WriteHeader(501)
})

所有实现的路由,都支持以下功能:

  • 路由参数;
  • 支持正则表达式作为路由项匹配方式;
  • 拦截正则表达式的行为;
  • 自动生成 OPTIONS 请求处理方式;
  • 自动生成 HEAD 请求处理方式;
  • 根据路由反向生成地址;
  • 任意风格的路由,比如 discuz 这种不以 / 作为分隔符的;
  • 分组路由,比如按域名,或是版本号等;
  • CORS 跨域资源的处理;
  • 支持中间件;
  • 自动生成 OPTIONS * 请求;
  • 静态文件系统;
  • TRACE 请求方法的支持;
  • panic 处理;

 

  • 0、gorilla/mux Package gorilla/mux implements a request router and dispatcher for matching incoming requests to their respective handler. The name mux stands for “HTTP request multiplexer”. Like the st

  • 最近终于闲下来,有时间阅读gorilla/mux。这个是我们在用Golang搭建Web服务器的时候经常用到的库,因此非常重要。这里是我阅读源码和参考了别人的博客之后得到一些总结。 使用的例子 我们从下面这个简单的代码开始追踪分析。 package main import ( "github.com/gorilla/mux" "log" "net/http" ) func YourHandl

  • gorilla/mux 源码分析 gorilla/mux是一个强大的路由,小巧但是稳定高效,不仅可以支持正则路由还可以按照Method,header,host等信息匹配,可以从我们设定的路由表达式中提取出参数方便上层应用,而且完全兼容http.ServerMux gorilla/mux源码地址 官方提供的使用实例: r := mux.NewRouter() r.HandleFunc("/produ

  • 概述 gorilla/mux(HTTP request multiplexer,github地址)是一个对请求进行路由的实现。它有以下这些特点: 实现了http.Handler接口,因此可以兼容标准的http.ServeMux 可以匹配URL 主机,路径,路径前缀,头部,查询值,HTTP方法或用户自定义的匹配 URL 主机、路径、查询值可以使用正则表达式匹配 可以使用子路由。只有当父路由匹配成功后

  • mux源码分析 http服务 http相关的网络服务,我们需要关注的都是客户端请求和服务端应答。在客户端请求(request)的过程中,重要的是路由。在服务端当接收到路由请求的时候,需要通过处理,再进行应答(response)。在接收request的过程中,路由是很重要的,这相当于是一个Multiplexer,Go中有内置的DefaultServerMux,也可以自定义Multiplexer。这里

  • If we wanna play with RIL and rild on any device, we need to better understand how to use the MUX as part of the AP-BP communication of AOS. In this case we'll discuss the use of the MTK specific (?)

  • DefaultServeMux阅读 可以查看到ServeMux结构的定义如下: type ServeMux struct { mu sync.RWMutex m map[string]muxEntry hosts bool } type muxEntry struct { explicit bool h Handler

  • mux源码分析 文章大概内容介绍 首先要说的是虽然这一篇文章是想要能够分析mux的源码,但是可能因为个人水平原因同时也是我自己对于源码的态度,可能想要达到的效果是能够站在一个比较高层的角度去看这个源码,而不是说面面俱到地能够说清楚源码的每一行为什么要这么做。 Package gorilla/mux implements a request router and dispatcher for mat

  • //只要实现了Handler的接口就可以当作自定义的路由来用,也就是带上ServerHttp的方法就可以了。 func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { // Clean path to canonical form and redirect. if p := cleanPath(re

 相关资料
  • 问题内容: https://cloud.google.com/appengine/docs/go/users/ 我在这里看到他们没有指定使用任何路由器…:https : //cloud.google.com/appengine/docs/go/config/appconfig 在与Golang一起使用的Google Cloud中,它表示要在中指定每个处理程序。这是否意味着我们不应该使用第三方路由器

  • 路由功能浅谈 在本章 选择恰当的分片数量和分片副本数量 一节中,已经提到使用路由功能可以只在一个分片上执行查询命令,作为提高系统吞吐量的一种解决方案。接下来作者将详细地介绍这一功能。 分片和分片中数据 通常情况下,ElasticSearch是如何把数据分发到各个分片中,哪个分片存储哪一类的文档等细节并不重要。因为查询时,将查询命令分发到每个分片就OK了。唯一的关键点在于算法,将数据均等地分配到各个

  • 我想创建OpenAPI UI规范,在静态编程语言上使用Spring WebFlux功能路由器。Spring Boot v.2.5.2,springdoc-openapi v.1.5.9。这是我的路由器类: 我想创建一个 GET 查询,如 其中1是我想要的用户ID。 但我的OpenAPI的UI仍然尝试使用GET参数创建查询 这显然会导致错误400。很高兴知道我的@RouterAction应该如何正确

  • 本文向大家介绍JS实现简单路由器功能的方法,包括了JS实现简单路由器功能的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现简单路由器功能的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 我是否可以使用新的Kotlin DSL设置路由,例如: 是否使用非反应web部件?因为底层数据库将是Postgres和非反应性的基于servlet的应用服务器,所以我不想/不需要使用Flux或Mono来返回类型或存储库函数。但我喜欢新的路由器DSL与Kotlin一起使用,它比基于注释的功能更强大,更容易掌握所有的应用程序路由。

  • 本文向大家介绍Django DRF路由与扩展功能的实现,包括了Django DRF路由与扩展功能的实现的使用技巧和注意事项,需要的朋友参考一下 一. 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据 destory() 删除数据 ViewSe