MST
星途 面试题库

面试题:Go标准库中HTTP包的深入应用

假设你要使用Go的`net/http`标准库构建一个简单的HTTP服务器,要求该服务器能处理不同的HTTP方法(GET、POST),并且在处理POST请求时解析表单数据。请写出主要的代码框架,并阐述`http.Handler`接口的作用以及`http.ServeMux`的原理。
14.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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.HandlerServeHTTP方法来处理请求;如果没有找到,则返回一个404 Not Found响应。