go HttpRouter

254 阅读2分钟

golang httprouter

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

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

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

gin框架就是以httprouter为基础开发的,下面我们来学习一下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() {
	r := httprouter.New()
	r.GET("/", Index)
	r.GET("/hello/:name", Hello)
	err := http.ListenAndServe(":8080", r)
	if err != nil {
		log.Fatal(err)
	}
}

在浏览器输入:http://localhost:8080/,输出:Welcome!

在浏览器输入:http://localhost:8080/hello/ghz,输出:hello, zs!

http router 请求方法

httprouter 为所有的HTTP Method 提供了快捷的使用方式,只需要调用对应的方法即可。

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

使用postman测试