go http server读书笔记
package main
import (
"fmt"
"net/http"
"time"
)
type customHandler struct {
}
func (cb *customHandler) chenxun(w http.ResponseWriter, r *http.Request) {
fmt.Println("customHandler!!")
w.Write([]byte("customHandler!!"))
}
func main() {
var server *http.Server = &http.Server{
Addr: ":8080",
Handler: &customHandler{},
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
server.ListenAndServe()
select {}
}
HTTP服务器
接下来就是重点了,我们的HTTP服务器,这个大家都不陌生,HTTP是最常用的方式之一,通用性很强,跨团队协作上也比较受到推荐,排查问题也相对来说简单。
我们接下来以3种方式来展现Golang的HTTP服务器的简洁和强大。
- 写一个简单的HTTP服务器
- 写一个稍微复杂带路由的HTTP服务器
- 分析源码,然后实现一个自定义Handler的服务器
然后我们对照net/http包来进行源码分析,加强对http包的理解。
1、写一个简单的HTTP服务器:
package main;
import (
"net/http"
)
funchello(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello"))
}
funcsay(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello"))
}
funcmain() {
http.HandleFunc("/hello", hello);
http.Handle("/handle",http.HandlerFunc(say));
http.ListenAndServe(":8001", nil);
select{
};//阻塞进程
}
是不是很简单,我用2种方式演示了这个例子,HandleFunc和Handle方式不同,却都能实现一个路由的监听,其实很简单,但是很多人看到这都会有疑惑,别着急,咱们源码分析的时候你会看到。
2、写一个稍微复杂带路由的HTTP服务器:
对着上面的例子想一个问题,我们在开发中会遇到很多问题,比如handle/res,handle/rsa…等等路由,这两个路由接受的参数都不一样,我们应该怎么写。我先来个图展示下运行结果。
是不是挺惊讶的,404了,路由没有匹配到。可是我们写handle这个路由了。
问题:
- 什么原因导致的路由失效
- 如何解决这种问题,做一个可以用Controller来控制的路由
问题1:
我们在源码阅读分析的时候会解决。
问题2:
我们可以设定一个控制器Handle,它有2个action,我们的执行handle/res对应的结果是调用Handle的控制器下的res方法。这样是不是很酷。
来我们先上代码:
静态目录:
- css
- js
- image
静态目录很好实现,只要一个函数http.FileServer(),这个函数从文字上看就是文件服务器,他需要传递一个目录,我们常以http.Dir("Path")来传递。
其他目录大家自己实现下,我们来实现问题2,一个简单的路由。
我们来看下代码
package main;
import (
"net/http"
"strings"
"reflect"
"fmt"
)
funchello(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("Hello"));
}
type Handlers struct{
}
func(h *Handlers) ResAction(w http.ResponseWriter, req *http.Request) {
fmt.Println("res");
w.Write([]