Files
common/http/http.go

125 lines
3.6 KiB
Go
Raw Normal View History

2025-11-25 11:51:16 +08:00
package http
import (
"context"
"errors"
"fmt"
2025-11-26 10:38:15 +08:00
_ "gitee.com/red-future---jilin-g/common/consul"
"gitee.com/red-future---jilin-g/common/jaeger"
"gitee.com/red-future---jilin-g/common/middleware"
2025-11-25 11:51:16 +08:00
"gitee.com/red-future---jilin-g/common/utils"
"github.com/gogf/gf/contrib/registry/consul/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/net/gsel"
"github.com/gogf/gf/v2/net/gsvc"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/gconv"
"net/http"
"reflect"
"regexp"
"strings"
2025-11-25 11:51:16 +08:00
)
type ResponseEmpty struct {
}
const PageSize = 20
type Page struct {
PageNum int `p:"pageNum"` //当前页码
PageSize int `p:"pageSize"` //每页数
Total int //总页数
}
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() {
//s.Use(common.Cors) //中间件验证
//s.EnablePProf() //启用性能分析
2025-11-26 10:38:15 +08:00
Httpserver.SetOpenApiPath("/api.json")
Httpserver.SetSwaggerPath("/docs") //api文档访问路径
Httpserver.SetDumpRouterMap(true) //关闭打印路由注册信息
Httpserver.SetSwaggerUITemplate(`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="SwaggerUI"/>
<title>SwaggerUI</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.10.5/swagger-ui.min.css" />
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.10.5/swagger-ui-bundle.js" crossorigin></script>
<script>
window.onload = () => {
window.ui = SwaggerUIBundle({
url: '{SwaggerUIDocUrl}',
dom_id: '#swagger-ui',
});
};
</script>
</body>
</html>
`)
Httpserver.BindMiddlewareDefault(ghttp.MiddlewareCORS, ghttp.MiddlewareHandlerResponse, middleware.Limiter, jaeger.NewTracer) //使用默认http返回结构
2025-11-26 10:38:15 +08:00
go Httpserver.Run()
2025-11-26 11:56:05 +08:00
consulCfg, _ := g.Cfg().Get(context.Background(), "consul.address")
consulAddr := consulCfg.String()
registry, err := consul.New(consul.WithAddress(consulAddr))
if err != nil {
panic(err)
}
gsvc.SetRegistry(registry)
gsel.SetBuilder(gsel.NewBuilderRoundRobin())
Httpclient.SetDiscovery(gsvc.GetRegistry())
}
func RouteRegister(controllers []interface{}) {
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) {
group.Bind(t)
})
}
}
2025-11-25 11:51:16 +08:00
func doRequest(ctx context.Context, method string, url string, target any, data ...any) (err error) {
err = utils.ValidStructPtr(target)
if err != nil {
return
}
Httpclient.SetHeader("Authorization", g.RequestFromCtx(ctx).GetHeader("Authorization"))
2025-11-26 11:56:05 +08:00
response, err := Httpclient.DoRequest(ctx, method, url, data)
2025-11-25 11:51:16 +08:00
if err != nil {
return
}
defer func() {
if err = response.Close(); err != nil {
glog.Errorf(ctx, `%+v`, err)
}
}()
result := response.ReadAll()
resultStrut := &ghttp.DefaultHandlerResponse{}
if gconv.Struct(result, resultStrut); resultStrut.Code != 200 {
err = errors.New(resultStrut.Message)
} else {
gconv.Struct(resultStrut.Data, target)
}
return
}
func Get(ctx context.Context, url string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodGet, url, target, data)
return
}
func Post(ctx context.Context, url string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodPost, url, target, data)
return
}