HttpRouter

59 阅读1分钟

介绍

HttpRouter是一种轻量级高性能的,golang HTTP请求路由器。

与Golang默认路由相比,此路由器支持路由模式中的变量并匹配请求方法。它还可以更好地扩展。

该路由器针对高性能和小内存占用进行了优化。即使有很长的路径和大量的路线,它也能很好地扩展。压缩动态特里(基数树)结构用于有效匹配。

gin框架就是以httprouter为基础开发的

下载安装

go get github.com/julienschmidt/httprouter

路由实例

package main

import (
   "fmt"
   "log"
   "net/http"

   "github.com/julienschmidt/httprouter"
)

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))
}

请求方法

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

restful风格路由

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/julienschmidt/httprouter"
)

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 getuser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    uid := ps.ByName("uid")
    fmt.Fprintf(w, "you are get user %s", uid)
}

func modifyuser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    uid := ps.ByName("uid")
    fmt.Fprintf(w, "you are modify user %s", uid)
}

func deleteuser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    uid := ps.ByName("uid")
    fmt.Fprintf(w, "you are delete user %s", uid)
}

func adduser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    // uid := r.FormValue("uid")
    uid := ps.ByName("uid")
    fmt.Fprintf(w, "you are add user %s", uid)
}

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

    router.GET("/user/:uid", getuser)
    router.POST("/adduser/:uid", adduser)
    router.DELETE("/deluser/:uid", deleteuser)
    router.PUT("/moduser/:uid", modifyuser)

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