How to parse JSON request body? Use ioutil.ReadAll() to read the request body. Use json.Unmarshal() to parse the JSON body. How can I use middleware to verify that an HTTP request is authenticated? Create a middleware function to validate the token. Register routes in the router and use middleware to handle requests. How to get database connection via HTTP request context? Create a middleware function to get the database connection. Store the connection in the context in the middleware function. Register routes in the router and use middleware to handle requests.
Analysis and answers to common problems in GoLang framework development
In the process of GoLang framework development, we will encounter various The problem. This article collects several of the most common questions and provides detailed answers and practical cases.
Question 1: How to parse the JSON request body?
// 解析 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 请求正文 }
Question 2: How to use middleware to verify that an HTTP request is authenticated?
// 验证 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) }
Question 3: How to obtain a database connection through HTTP request context?
// 获取数据库连接的中间件 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) }
The above is the detailed content of Analysis and answers to common problems in golang framework development. For more information, please follow other related articles on the PHP Chinese website!