如何解析 JSON 請求內文?使用 ioutil.ReadAll() 讀取請求正文。使用 json.Unmarshal() 解析 JSON 正文。如何使用中間件驗證 HTTP 請求是否經過驗證?建立一個中間件函數來驗證令牌。在路由器中註冊路由,使用中間件來處理請求。如何透過 HTTP 請求上下文取得資料庫連線?建立一個中間件函數來取得資料庫連線。在中間件函數中將連線儲存在上下文中。在路由器中註冊路由,使用中間件來處理請求。
GoLang 框架開發常見問題剖析與解答
在GoLang 框架開發過程中,我們會遇到各種的問題。本文收集了幾個最常見的問題,並提供了詳細的解答和實戰案例。
問題 1:如何解析 JSON 請求內文?
// 解析 JSON 请求正文 func parseJSON(w http.ResponseWriter, r *http.Request) (map[string]interface{}, error) { body, err := ioutil.ReadAll(r.Body) if err != nil { return nil, err } defer r.Body.Close() var bodyMap map[string]interface{} if err := json.Unmarshal(body, &bodyMap); err != nil { return nil, err } return bodyMap, nil } // 实战案例 func handleJSON(w http.ResponseWriter, r *http.Request) { bodyMap, err := parseJSON(w, r) if err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return } // 处理 JSON 请求正文 }
問題 2:如何使用中間件驗證 HTTP 請求是否經過驗證?
// 验证 HTTP 请求是否经过身份验证的中间件 func AuthMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 获取 Authorization 头 authToken := r.Header.Get("Authorization") // 验证令牌有效性 if !validateToken(authToken) { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } // 继续执行请求处理程序 next.ServeHTTP(w, r) }) } // 实战案例 func main() { // 创建一个 HTTP 路由器 router := http.NewServeMux() // 注册路由,使用 AuthMiddleware 验证请求 router.HandleFunc("/protected", AuthMiddleware(http.HandlerFunc(handleProtected))) // 启动服务器 http.ListenAndServe(":8080", router) }
問題 3:如何透過 HTTP 請求 上下文取得資料庫連線?
// 获取数据库连接的中间件 func DBMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 获取数据库连接 db, err := connectDB() if err != nil { http.Error(w, "Unable to connect to the database", http.StatusInternalServerError) return } // 将数据库连接存储在上下文中 ctx := context.WithValue(r.Context(), "db", db) // 继续执行请求处理程序 next.ServeHTTP(w, r.WithContext(ctx)) }) } // 实战案例 func main() { // 创建一个 HTTP 路由器 router := http.NewServeMux() // 注册路由,使用 DBMiddleware 获取数据库连接 router.HandleFunc("/protected", DBMiddleware(http.HandlerFunc(handleProtected))) // 启动服务器 http.ListenAndServe(":8080", router) }
以上是golang框架開發常見問題剖析與解答的詳細內容。更多資訊請關注PHP中文網其他相關文章!