高效处理HTTP请求:深入解析Golang中的net/http包使用技巧
一、net/http
包简介
二、基本服务器搭建
首先,我们从搭建一个基本的HTTP服务器开始。以下是一个简单的示例:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
三、请求处理优化
1. 并发处理
func handler(w http.ResponseWriter, r *http.Request) {
go func() {
// 处理耗时操作
fmt.Fprintf(w, "Request handled in goroutine")
}()
}
2. 中间件使用
中间件可以在请求到达处理函数之前进行预处理,例如日志记录、身份验证等。以下是一个简单的中间件示例:
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("Request received:", r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", handler)
http.ListenAndServe(":8080", loggingMiddleware(mux))
}
3. 路由优化
import "github.com/gorilla/mux"
func main() {
r := mux.NewRouter()
r.HandleFunc("/users/{id}", userHandler)
http.ListenAndServe(":8080", r)
}
四、请求解析与响应
1. 解析请求参数
获取和处理请求参数是常见的操作。可以使用r.URL.Query()
获取查询参数,使用r.FormValue
获取POST表单数据。
func handler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
fmt.Fprintf(w, "Hello, %s!", name)
}
2. 设置响应头
合理设置响应头可以提高API的可维护性和兼容性。
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprintf(w, `{"message": "Hello, World!"}`)
}
五、错误处理
func handler(w http.ResponseWriter, r *http.Request) {
if err := someOperation(); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "Operation successful")
}
六、性能优化
1. 静态文件服务
func main() {
fs := http.FileServer(http.Dir("static"))
http.Handle("/static/", fs)
http.ListenAndServe(":8080", nil)
}
2. 压缩响应
使用compress/gzip
包可以压缩响应内容,减少传输数据量。
import "github.com/NYTimes/gziphandler"
func main() {
http.Handle("/", gziphandler.GzipHandler(http.HandlerFunc(handler)))
http.ListenAndServe(":8080", nil)
}
七、安全考虑
1. 防止跨站请求伪造(CSRF)
使用gorilla/sessions
等库可以有效地防止CSRF攻击。
import "github.com/gorilla/sessions"
var store = sessions.NewCookieStore([]byte("secret-key"))
func handler(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "session-name")
// 验证session等操作
}
2. HTTPS支持
func main() {
http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)
}