mirror of
https://github.com/yangjian102621/geekai.git
synced 2026-04-12 06:04:26 +08:00
81 lines
1.8 KiB
Go
81 lines
1.8 KiB
Go
package middleware
|
|
|
|
import (
|
|
"bytes"
|
|
"geekai/utils"
|
|
"io"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// 统一参数处理
|
|
func ParameterHandlerMiddleware() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
// GET 参数处理
|
|
params := c.Request.URL.Query()
|
|
for key, values := range params {
|
|
for i, value := range values {
|
|
params[key][i] = strings.TrimSpace(value)
|
|
}
|
|
}
|
|
// update get parameters
|
|
c.Request.URL.RawQuery = params.Encode()
|
|
// skip file upload requests
|
|
contentType := c.Request.Header.Get("Content-Type")
|
|
if strings.Contains(contentType, "multipart/form-data") {
|
|
c.Next()
|
|
return
|
|
}
|
|
|
|
if strings.Contains(contentType, "application/json") {
|
|
// process POST JSON request body
|
|
bodyBytes, err := io.ReadAll(c.Request.Body)
|
|
if err != nil {
|
|
c.Next()
|
|
return
|
|
}
|
|
|
|
// 还原请求体
|
|
c.Request.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
|
|
// 将请求体解析为 JSON
|
|
var jsonData map[string]any
|
|
if err := c.ShouldBindJSON(&jsonData); err != nil {
|
|
c.Next()
|
|
return
|
|
}
|
|
|
|
// 对 JSON 数据中的字符串值去除两端空格
|
|
trimJSONStrings(jsonData)
|
|
// 更新请求体
|
|
c.Request.Body = io.NopCloser(bytes.NewBufferString(utils.JsonEncode(jsonData)))
|
|
}
|
|
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
// 递归对 JSON 数据中的字符串值去除两端空格
|
|
func trimJSONStrings(data any) {
|
|
switch v := data.(type) {
|
|
case map[string]any:
|
|
for key, value := range v {
|
|
switch valueType := value.(type) {
|
|
case string:
|
|
v[key] = strings.TrimSpace(valueType)
|
|
case map[string]any, []any:
|
|
trimJSONStrings(value)
|
|
}
|
|
}
|
|
case []any:
|
|
for i, value := range v {
|
|
switch valueType := value.(type) {
|
|
case string:
|
|
v[i] = strings.TrimSpace(valueType)
|
|
case map[string]any, []any:
|
|
trimJSONStrings(value)
|
|
}
|
|
}
|
|
}
|
|
}
|