Files
common/http/http.go

135 lines
4.4 KiB
Go
Raw Normal View History

2025-11-25 11:51:16 +08:00
package http
import (
"context"
"errors"
"fmt"
2025-12-04 17:39:31 +08:00
"net/http"
"reflect"
"regexp"
"strings"
2025-11-26 10:38:15 +08:00
_ "gitee.com/red-future---jilin-g/common/consul"
"gitee.com/red-future---jilin-g/common/jaeger"
2025-12-30 18:27:09 +08:00
"gitee.com/red-future---jilin-g/common/log/controller"
2025-11-25 11:51:16 +08:00
"gitee.com/red-future---jilin-g/common/utils"
"github.com/gogf/gf/v2/frame/g"
2026-01-17 17:58:13 +08:00
"github.com/gogf/gf/v2/net/gclient"
2025-11-25 11:51:16 +08:00
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/net/gsvc"
2025-12-01 10:06:11 +08:00
"github.com/gogf/gf/v2/os/gtime"
2025-11-25 11:51:16 +08:00
"github.com/gogf/gf/v2/util/gconv"
)
2025-11-26 10:38:15 +08:00
var Httpserver = g.Server()
2025-11-26 11:56:05 +08:00
var Httpclient = g.Client()
func init() {
2025-12-01 10:06:11 +08:00
err := gtime.SetTimeZone("Asia/Shanghai")
if err != nil {
panic("设置时区失败")
}
//s.Use(common.Cors) //中间件验证
//s.EnablePProf() //启用性能分析
2025-11-28 11:16:21 +08:00
Httpserver.SetOpenApiPath("/api.json")
2025-11-28 09:28:17 +08:00
Httpserver.SetDumpRouterMap(true) //关闭打印路由注册信息
Httpserver.BindMiddlewareDefault(ghttp.MiddlewareHandlerResponse)
2025-11-26 11:56:05 +08:00
Httpclient.SetDiscovery(gsvc.GetRegistry())
}
2026-01-27 09:34:55 +08:00
func RouteRegister(controllers []interface{}) {
2025-12-30 18:27:09 +08:00
Httpserver.Group("/log", func(group *ghttp.RouterGroup) {
group.Middleware(jaeger.NewTracer)
group.Bind(controller.OperationLog)
})
2026-01-27 08:39:05 +08:00
Httpserver.BindHandler("/uploadConfig", func(r *ghttp.Request) {
config := g.Config().MustGet(r.GetCtx(), "upload")
r.Response.WriteJsonExit(config)
})
re := regexp.MustCompile("[A-Z]")
for _, t := range controllers {
sName := reflect.ValueOf(t).Elem().Type().Name()
convertedStr := re.ReplaceAllStringFunc(sName, func(s string) string {
return fmt.Sprintf("/%s", strings.ToLower(s))
})
2025-11-26 10:38:15 +08:00
Httpserver.Group(convertedStr, func(group *ghttp.RouterGroup) {
2025-11-28 17:13:16 +08:00
group.Middleware(jaeger.NewTracer)
group.Bind(t)
})
}
go Httpserver.Run()
}
// doRequest 统一HTTP请求处理DELETE用ContentJson发送bodygconv.Struct增加err检查
2025-12-23 16:33:57 +08:00
func doRequest(ctx context.Context, method string, url string, headers map[string]string, target any, data ...any) (err error) {
2025-11-25 11:51:16 +08:00
err = utils.ValidStructPtr(target)
if err != nil {
return
}
2026-01-17 17:58:13 +08:00
client := Httpclient.Clone()
// POST/PUT/DELETE请求都需要显式用ContentJson序列化body
if (method == http.MethodPost || method == http.MethodPut || method == http.MethodDelete) && len(data) > 0 {
client = client.ContentJson()
}
// 最后设置headers确保不会被ContentJson覆盖
2026-01-13 11:08:17 +08:00
if len(headers) > 0 {
client.SetHeaderMap(headers)
} else {
client.SetHeader("Authorization", g.RequestFromCtx(ctx).GetHeader("Authorization"))
}
2026-01-17 17:58:13 +08:00
// 修复避免data...展开导致的双重包装问题
// 当只有一个元素时,直接传递该元素,避免被包装成数组
var response *gclient.Response
if len(data) == 1 {
response, err = client.DoRequest(ctx, method, url, data[0])
} else {
response, err = client.DoRequest(ctx, method, url, data...)
}
2025-11-25 11:51:16 +08:00
if err != nil {
return
}
2025-12-31 14:03:37 +08:00
defer response.Close()
2025-11-25 11:51:16 +08:00
result := response.ReadAll()
2026-01-17 17:58:13 +08:00
2026-01-27 17:54:58 +08:00
// 统一处理内部API响应格式{code:200,message:"",data:{...}}
2025-11-25 11:51:16 +08:00
resultStrut := &ghttp.DefaultHandlerResponse{}
2026-01-13 11:20:14 +08:00
if err = gconv.Struct(result, &resultStrut); err != nil { // 修复增加err检查
return errors.New("响应解析失败: " + err.Error())
}
2026-01-17 17:58:13 +08:00
// 添加调试日志:打印解析后的结构
g.Log().Debugf(ctx, "[HTTP] 解析后结构: Code=%d, Message=%s, Data类型=%T, Data值=%+v",
resultStrut.Code, resultStrut.Message, resultStrut.Data, resultStrut.Data)
2026-01-13 11:08:17 +08:00
if resultStrut.Code == 200 || resultStrut.Code == 0 {
if err = gconv.Struct(resultStrut.Data, target); err != nil { // 修复增加err检查
return errors.New("数据解析失败: " + err.Error())
}
2026-01-17 17:58:13 +08:00
// 添加调试日志打印最终的target
g.Log().Debugf(ctx, "[HTTP] 最终target: %+v", target)
2026-01-13 11:08:17 +08:00
} else {
err = errors.New(resultStrut.Message)
2025-11-25 11:51:16 +08:00
}
return
}
2025-12-23 16:33:57 +08:00
func Get(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
2026-01-17 17:58:13 +08:00
err = doRequest(ctx, http.MethodGet, url, headers, target, data...)
2025-11-25 11:51:16 +08:00
return
}
2025-12-23 16:33:57 +08:00
func Post(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
2026-01-17 17:58:13 +08:00
err = doRequest(ctx, http.MethodPost, url, headers, target, data...)
2025-11-25 11:51:16 +08:00
return
}
2025-12-23 16:33:57 +08:00
func Put(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
2026-01-17 17:58:13 +08:00
err = doRequest(ctx, http.MethodPut, url, headers, target, data...)
2025-12-18 16:43:05 +08:00
return
}
2025-12-23 16:33:57 +08:00
func Delete(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
2026-01-17 17:58:13 +08:00
err = doRequest(ctx, http.MethodDelete, url, headers, target, data...)
2025-12-18 16:43:05 +08:00
return
}