Files
common/http/http.go

109 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package http
import (
"context"
"errors"
"fmt"
"net/http"
"reflect"
"regexp"
"strings"
_ "gitee.com/red-future---jilin-g/common/consul"
"gitee.com/red-future---jilin-g/common/jaeger"
"gitee.com/red-future---jilin-g/common/log/controller"
"gitee.com/red-future---jilin-g/common/utils"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/net/gsvc"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
)
var Httpserver = g.Server()
var Httpclient = g.Client()
func init() {
err := gtime.SetTimeZone("Asia/Shanghai")
if err != nil {
panic("设置时区失败")
}
//s.Use(common.Cors) //中间件验证
//s.EnablePProf() //启用性能分析
Httpserver.SetOpenApiPath("/api.json")
Httpserver.SetDumpRouterMap(true) //关闭打印路由注册信息
Httpserver.BindMiddlewareDefault(ghttp.MiddlewareHandlerResponse)
Httpclient.SetDiscovery(gsvc.GetRegistry())
}
func RouteRegister(controllers []interface{}) {
Httpserver.Group("/log", func(group *ghttp.RouterGroup) {
group.Middleware(jaeger.NewTracer)
group.Bind(controller.OperationLog)
})
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))
})
Httpserver.Group(convertedStr, func(group *ghttp.RouterGroup) {
group.Middleware(jaeger.NewTracer)
group.Bind(t)
})
}
go Httpserver.Run()
}
// doRequest 统一HTTP请求处理DELETE用ContentJson发送bodygconv.Struct增加err检查
func doRequest(ctx context.Context, method string, url string, headers map[string]string, target any, data ...any) (err error) {
err = utils.ValidStructPtr(target)
if err != nil {
return
}
client := Httpclient
if len(headers) > 0 {
client = Httpclient.Clone()
client.SetHeaderMap(headers)
} else {
client.SetHeader("Authorization", g.RequestFromCtx(ctx).GetHeader("Authorization"))
}
if method == http.MethodDelete && len(data) > 0 { // DELETE请求显式用ContentJson序列化body
client = client.ContentJson()
}
response, err := client.DoRequest(ctx, method, url, data...)
if err != nil {
return
}
defer response.Close()
result := response.ReadAll()
resultStrut := &ghttp.DefaultHandlerResponse{}
if err = gconv.Struct(result, &resultStrut); err != nil { // 修复增加err检查
return errors.New("响应解析失败: " + err.Error())
}
if resultStrut.Code == 200 || resultStrut.Code == 0 {
if err = gconv.Struct(resultStrut.Data, target); err != nil { // 修复增加err检查
return errors.New("数据解析失败: " + err.Error())
}
} else {
err = errors.New(resultStrut.Message)
}
return
}
func Get(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodGet, url, headers, target, data)
return
}
func Post(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodPost, url, headers, target, data)
return
}
func Put(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodPut, url, headers, target, data)
return
}
func Delete(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodDelete, url, headers, target, data)
return
}