package http import ( "context" "encoding/json" "io" "net/http" "strconv" "git.toowon.com/jimmy/go-common/middleware" ) // ParseJSON 解析JSON请求体 // r: HTTP请求 // v: 目标结构体指针 func ParseJSON(r *http.Request, v interface{}) error { body, err := io.ReadAll(r.Body) if err != nil { return err } defer r.Body.Close() if len(body) == 0 { return nil } return json.Unmarshal(body, v) } // GetQuery 获取查询参数 // r: HTTP请求 // key: 参数名 // defaultValue: 默认值 func GetQuery(r *http.Request, key, defaultValue string) string { value := r.URL.Query().Get(key) if value == "" { return defaultValue } return value } // GetQueryInt 获取整数查询参数 // r: HTTP请求 // key: 参数名 // defaultValue: 默认值 func GetQueryInt(r *http.Request, key string, defaultValue int) int { value := r.URL.Query().Get(key) if value == "" { return defaultValue } intValue, err := strconv.Atoi(value) if err != nil { return defaultValue } return intValue } // GetQueryInt64 获取int64查询参数 func GetQueryInt64(r *http.Request, key string, defaultValue int64) int64 { value := r.URL.Query().Get(key) if value == "" { return defaultValue } intValue, err := strconv.ParseInt(value, 10, 64) if err != nil { return defaultValue } return intValue } // GetQueryBool 获取布尔查询参数 func GetQueryBool(r *http.Request, key string, defaultValue bool) bool { value := r.URL.Query().Get(key) if value == "" { return defaultValue } boolValue, err := strconv.ParseBool(value) if err != nil { return defaultValue } return boolValue } // GetQueryFloat64 获取float64查询参数 func GetQueryFloat64(r *http.Request, key string, defaultValue float64) float64 { value := r.URL.Query().Get(key) if value == "" { return defaultValue } floatValue, err := strconv.ParseFloat(value, 64) if err != nil { return defaultValue } return floatValue } // GetFormValue 获取表单值 func GetFormValue(r *http.Request, key, defaultValue string) string { value := r.FormValue(key) if value == "" { return defaultValue } return value } // GetFormInt 获取表单整数 func GetFormInt(r *http.Request, key string, defaultValue int) int { value := r.FormValue(key) if value == "" { return defaultValue } intValue, err := strconv.Atoi(value) if err != nil { return defaultValue } return intValue } // GetFormInt64 获取表单int64 func GetFormInt64(r *http.Request, key string, defaultValue int64) int64 { value := r.FormValue(key) if value == "" { return defaultValue } intValue, err := strconv.ParseInt(value, 10, 64) if err != nil { return defaultValue } return intValue } // GetFormBool 获取表单布尔值 func GetFormBool(r *http.Request, key string, defaultValue bool) bool { value := r.FormValue(key) if value == "" { return defaultValue } boolValue, err := strconv.ParseBool(value) if err != nil { return defaultValue } return boolValue } // GetHeader 获取请求头 func GetHeader(r *http.Request, key, defaultValue string) string { value := r.Header.Get(key) if value == "" { return defaultValue } return value } // GetPaginationParams 获取分页参数 // 返回 page, pageSize // 默认 page=1, pageSize=10 func GetPaginationParams(r *http.Request) (page, pageSize int) { page = GetQueryInt(r, "page", 1) pageSize = GetQueryInt(r, "pageSize", 10) // 参数校验 if page < 1 { page = 1 } if pageSize < 1 { pageSize = 10 } if pageSize > 1000 { pageSize = 1000 // 限制最大页面大小 } return page, pageSize } // GetOffset 根据页码和每页大小计算偏移量 func GetOffset(page, pageSize int) int { if page < 1 { page = 1 } return (page - 1) * pageSize } // GetTimezone 从请求的context中获取时区 // 如果使用了middleware.Timezone中间件,可以从context中获取时区信息 // 如果未设置,返回默认时区 AsiaShanghai func GetTimezone(r *http.Request) string { return middleware.GetTimezoneFromContext(r.Context()) } // GetTimezoneFromContext 从context中获取时区 func GetTimezoneFromContext(ctx context.Context) string { return middleware.GetTimezoneFromContext(ctx) }