Go Web 1| 青训营笔记

88 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

创建 Web Server
  • http.Server 这是一个struct
    • Addr 字段表示网络地址
      • 如果为"",那么就是所有网络接口的 80 端口
    • Handler 字段
      • 如果为 nil,那么就是DefaultServeMux
    • ListenAndServe() 函数
package main

import "net/http"

func main() {
	server := http.Server{
		Addr:    "127.0.0.1:8080",
		Handler: nil,
	}
	server.ListenAndServe()
}
  • handler 是一个接口(interface)
  • handler 定义了一个方法 ServeHTTP()
    • HTTPResponseWriter
    • 指向 Request 这个 struct 的指针
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}
多个 Handler - http.Handle
  • 不指定 Server struct 里面的 Handler 字段值
  • 可以使用 http.Handle 将某个Handler 附加到DefaultServeMux
    • http 包有一个 Handle 函数
    • ServerMux struct 也有一个 Handle 方法
  • 如果调用 http.Handle,实际上调用的是 DefaultServeMux 上的Handle方法
    • DefaultServrMux 就是 ServerMux 的指针变量
  • Handler 函数就是那些行为与 handler 类似的函数
  • Handler 函数的签名与 ServeHTTP 方法的签名一样,接收:
    • 一个 http.ResponseWriter
    • 一个指向 http.Request 的指针

http.Handle 第二个参数是 Handler http.HandleFunc 第二个参数是一个Handler 函数

Go 内置的 Handler
  1. NotFoundHandler
  • func NotFoundHandler() Handler
  • 返回一个 handler,它给每个请求的响应都是 "404 page not found"
  1. RedirectHandler
  • func RedirectHandler(url string, code int) Handler
  • 返回一个 handler,它把每个请求使用给定的状态码跳转到指定的URL.
    • url,要跳转到的URL
    • code, 跳转的状态码(3xx),常见的:
      • StatusMovedPermanently
      • SttatusFound 或 StatusSeeOther 等
  1. StripPrefix
  • func StripPrefix(prefix string, h handler) Handler
  • 返回一个 handler,它从请求 URL 中去掉指定的前缀,然后再调用另一个 handler.
    • 如果请求的 URL 与提供的前缀不符,那么404
  • 略像中间件
    • prefix, URL 将要被移除的字符串前缀
    • h,是一个 handler,在移除字符串前缀之后,这个 handler 将会接收到请求.
  1. TimeoutHandler
  • func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler
  • 返回一个handler,它用来指定时间内运行传入的 h
  • 也相当于是一个修饰器
    • h,将要被修饰的 handler
    • dt,第一个 handler 允许的处理时间
    • msg,如果超时,那么就把 msg 返回给请求,表示响应时间过长
  1. FileServer
  • func FileServer(root FileSystem) Handler
  • 返回一个 handler,使用基于 root 的文件系统来响应请求
  • type FileSystem interface { Open(name string)(File, erroe)}
  • 使用时需要用到操作系统的文件系统,所以还需要委托给:
  • type Dir string
  • func (d Dir) Open(name string) (File, error)