208 lines
4.1 KiB
Go
208 lines
4.1 KiB
Go
package http
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"io"
|
||
"net/http"
|
||
"strconv"
|
||
|
||
"git.toowon.com/jimmy/go-commom/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)
|
||
}
|