美文网首页
从http.HandleFunc到简单路由

从http.HandleFunc到简单路由

作者: __missing | 来源:发表于2021-06-23 19:24 被阅读0次

前言

最近在学go,某天意外的看到了极客兔兔的七天用Go从零实现系列,给自己定个小目标。坚持跟极客兔兔学习go,并做个记录。

http.HandleFunc

内置的net/http包提供了http.HandleFunc方法,可以根据不同的访问路径,执行不同的代码片段

func main() {
      
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
        w.WriteHeader(200) 
        w.Write([]byte("index"))
    })
    http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request){         //只要请求path等于/test,都会走这个。无关请求方式是POST、GET等

        w.WriteHeader(200) //设置响应头为200
        w.Write([]byte("test")) //设置响应体
    })

    http.ListenAndServe(":9999", nil)
}

http.ListenAndServe

http.ListenAndServe(":9999", nil),是用来启动一个web服务,其中":9999",是指监听9999端口。第二个参数,需要传入一个实现了Handler接口的实例,即实现ServeHTTP(ResponseWriter, *Request)这个方法。传nil就会走默认的实例处理(顺带说一句go里的接口实现跟ts里的差不多,更类似于一种约定,并不需要像其他面向对象语言一样使用implements关键字来实现)net/http包底层会调用这个ServeHTTP方法,所以ServeHTTP差不多是我们处理http请求的入口和关键

  type engine struct {
  }

  func (t *engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    switch r.URL.Path {
    case "/test" :
        w.WriteHeader(201)
        w.Write([]byte("test1"))
    case "/" :
        w.WriteHeader(201)
        w.Write([]byte("index1"))
    default:
        w.WriteHeader(http.StatusNotFound)
        w.Write([]byte("404 not found"))
    }
}

func main() {
    http.ListenAndServe(":9999", new(engine))
}
  

简单静态路由

利用map将访问路径和处理handle的对应关系缓存起来实现一个简单的路由表

type HandlerFunc func( http.ResponseWriter, *http.Request)
type engine struct {
    router map[string]HandlerFunc
}

func (t *engine) addRoute(method string, pattern string, handler HandlerFunc) {
    key := method + "-" + pattern
    t.router[key] = handler
}
func (t *engine) GET(pattern string, handler HandlerFunc) {
    t.addRoute("GET", pattern, handler)
}

func (t *engine) POST(pattern string, handler HandlerFunc) {
    t.addRoute("POST", pattern, handler)
}

func (t *engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    key := r.Method + "-" + r.URL.Path
    if handle, ok := t.router[key]; ok {
        handle(w, r)

    } else {
        w.WriteHeader(http.StatusNotFound)
        w.Write([]byte("not found"))
    }
}

func main() {
    engine := new(engine)
    engine.router = make(map[string]HandlerFunc)

    engine.GET("/test", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(200)
        w.Write([]byte("test"))
    })

    engine.POST("/test", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusCreated)
        log.Println(r.Header)
        s,_ := ioutil.ReadAll(r.Body)

        w.Write(s)
    })

    http.ListenAndServe(":9999", engine)
}

相关文章

  • 从http.HandleFunc到简单路由

    前言 最近在学go,某天意外的看到了极客兔兔的七天用Go从零实现系列,给自己定个小目标。坚持跟极客兔兔学习go,并...

  • web路由机制

    路由的含义 简单来说,路由就是URL到函数的映射。 路由的分类 服务端路由 客户端路由客户端静态路由客户端动态路由...

  • golang net/http源码解析

    代码 http.HandleFunc("/hello", func(w http.ResponseWriter, ...

  • 组件化开发-简单的路由

    路由原理 动手写一个SimpleRouter,这个路由很简单主要是实现逻辑。1.所有的Activity都注册到路由...

  • iOS 组件化01

    《iOS 组件化-路由设计思路分析》 软件人员从软件工程的角度出发,从原来简单的MVC演化到MVP,MVVM,VI...

  • 深入理解Web路由

    1. 什么是路由 在Web开发过程中,经常会遇到『路由』的概念。那么,到底什么是路由?简单来说,路由就是URL到函...

  • 3.Flutter打卡-基础知识(2)

    路由管理 在web开发中,我们经常会碰到路由这个概念,简单来说,路由就是URL到函数的映射。对于服务器来说,当接收...

  • golong http server

    上面go实现的一个最简单的一个http服务器。 首先是http.HandleFunc,由下面代码可以看到Handl...

  • 前端微服务化解决方案5 - 路由分发

    路由分发式微前端 从应用分发路由到路由分发应用 用这句话来解释,微前端的路由,再合适不过来. 路由分发式微前端,即...

  • 前端路由

    路由是什么 在网络原理中,路由指的是分组从源到目的地时,决定端到端路径的网络范围的进程,做成硬件叫路由器,在路由器...

网友评论

      本文标题:从http.HandleFunc到简单路由

      本文链接:https://www.haomeiwen.com/subject/gjseyltx.html