01.Mygin实现简单Http
本篇是完全参考gin的功能,自己手动实现一个类似的功能,帮助自己理解和学习gin框架。目的:简单介绍net/http库以及http.Handler接口,实现简单路由请求的功能。
目的
- 简单介绍net/http库以及http.Handler接口
- 实现简单路由请求的功能
标准库启动Web服务
先看用标准库怎样启动一个web服务
1 | import "net/http" |
设置路由
我设置了一个 /hello 的简单路由,GET请求后返回 hello world。
1
2 ~ curl 127.0.0.1:8088/hello
hello world
为什么请求路由能够返回hello world,这就要从Golang的http包ListenAndServe.go中查看了。
ListenAndServe源码查看
我已经将源码上的注释翻译成了中文
1 | // ListenAndServe监听TCP网络地址addr,然后调用 |
实现Handler接口
- http包中HandleFunc的第二个参数是什么意思?点进官方包去看。看到第二个参数是要实现 Handler 接口的方法,根据路由匹配交给实现对应的方法处理。
1
2
3
4
5package http
type Handler interface {
ServeHTTP(w ResponseWriter, r *Request)
}
engine.go编写
基于此改造封装mygin/engine.go
1 | package mygin |
可以看到我编写了一个engine.go文件,包含了ServeHTTP方法,也就是engine实现了http包中 Handler 接口。http.ListenAndServe第二个参数把engine对象传过去,在http在处理时,就会去调用engine中的ServeHTTP方法。
main.go中调用
1 | package main |
编写好上诉代码后,启动main方法,可以看到我将 :8088当作地址传入调用engine.go中的Run方法,将 :8088 当作第一个参数传入http.ListenAndServe中,表示监听8088端口,第二个参数则是我们基于net/http标准库实现Web框架的入口,也就是engine中的ServeHTTP方法。
curl请求
1 | ~ curl 127.0.0.1:8088/hello |
看到上诉结果,代表已经实现了最核心的第一步,在Golang中,不管什么web框架,所有的请求都是在此基础上运行的。赶快去试试吧。