Go 在标准库中内置了功能强大的
net/http
包,可快速构建高并发、高性能的 HTTP 服务,广泛应用于微服务、Web后端、API中间层等场景。
一、快速创建一个HTTP服务
示例:最简Hello服务
go
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Go Web!")
}
func main() {
http.HandleFunc("/", helloHandler)
fmt.Println("Listening on http://localhost:8080/")
http.ListenAndServe(":8080", nil)
}
二、请求与响应对象详解
- •
http.Request
:封装了客户端请求的所有信息(URL、Header、Body等) - •
http.ResponseWriter
:用于构造服务器的响应
示例:获取请求信息
swift
func infoHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Method: %s\n", r.Method)
fmt.Fprintf(w, "URL: %s\n", r.URL.Path)
fmt.Fprintf(w, "Header: %v\n", r.Header)
}
三、处理URL参数与POST数据
1. 获取查询参数
scss
func queryHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
fmt.Fprintf(w, "Hello, %s!", name)
}
访问:http://localhost:8080/query?name=Go
2. 处理表单数据(POST)
scss
func formHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
username := r.FormValue("username")
fmt.Fprintf(w, "Welcome, %s!", username)
}
四、自定义HTTP路由与Handler
使用 http.ServeMux
css
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/hello", helloHandler)
mux.HandleFunc("/info", infoHandler)
http.ListenAndServe(":8080", mux)
}
使用第三方路由器(如 gorilla/mux
、chi
等)
arduino
// 示例略,可根据需要引入第三方库
五、构建HTTP客户端请求
Go 提供了强大的 http.Client
支持 GET/POST 等请求。
示例:GET请求
css
resp, err := http.Get("https://httpbin.org/get")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
示例:POST请求
go
data := url.Values{"name": {"Go"}}
resp, err := http.PostForm("https://httpbin.org/post", data)
defer resp.Body.Close()
六、JSON接口的处理
JSON响应
go
func jsonHandler(w http.ResponseWriter, r *http.Request) {
type Resp struct {
Status string `json:"status"`
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(Resp{"ok"})
}
JSON请求解析
go
func receiveJSON(w http.ResponseWriter, r *http.Request) {
type Req struct {
Name string `json:"name"`
}
var data Req
json.NewDecoder(r.Body).Decode(&data)
fmt.Fprintf(w, "Hello, %s", data.Name)
}
七、静态文件服务
less
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("public"))))
访问 /static/index.html
实际读取 public/index.html
文件。
八、HTTP中间件的编写
中间件常用于实现日志、认证、限流等功能。
go
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("Request: %s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
九、启动HTTPS服务(SSL)
go
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)
用于生产环境时,请使用自动证书工具如 Let's Encrypt + Caddy/Nginx 做代理。
十、总结
能力 | 工具与API |
---|---|
启动Web服务 | http.ListenAndServe |
构造REST接口 | HandlerFunc + JSON 编解码 |
发起HTTP请求 | http.Get , http.Post , http.Client |
路由与中间件 | ServeMux 或第三方路由器 |
文件服务与HTTPS | http.FileServer / ListenAndServeTLS |