package main
import (
"fmt"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", rootHandler)
mux.HandleFunc("/post", postHandler)
fmt.Println("Server is listening on :8080")
http.ListenAndServe(":8080", mux)
}
func rootHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet {
fmt.Fprintf(w, "This is a GET request")
}
}
func postHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodPost {
err := r.ParseForm()
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
fmt.Fprintf(w, "POST request received. Form data: %v", r.Form)
}
}
http.Handler
接口的作用
http.Handler
是一个接口,它定义了一个方法ServeHTTP
。任何实现了ServeHTTP
方法的类型都可以作为HTTP处理器。
- 当一个HTTP请求到达服务器时,服务器会调用处理器的
ServeHTTP
方法,将http.ResponseWriter
和*http.Request
作为参数传入,处理器通过http.ResponseWriter
向客户端发送响应,通过*http.Request
获取请求信息。
http.ServeMux
的原理
http.ServeMux
是Go语言标准库中默认的HTTP请求多路复用器。
- 它维护了一个映射表,将请求的URL路径与对应的
http.Handler
关联起来。
- 当一个请求到达时,
ServeMux
会根据请求的URL路径在映射表中查找对应的http.Handler
,如果找到则调用该http.Handler
的ServeHTTP
方法来处理请求;如果没有找到,则返回一个404 Not Found响应。