浏览代码

完成body转发

yjp 1 年之前
父节点
当前提交
7289e6667c
共有 2 个文件被更改,包括 114 次插入64 次删除
  1. 114 0
      convenient/gateway/body_mapping.go
  2. 0 64
      convenient/gateway/pass_through.go

+ 114 - 0
convenient/gateway/body_mapping.go

@@ -0,0 +1,114 @@
+package gateway
+
+import (
+	"git.sxidc.com/go-framework/baize/framework/binding"
+	"git.sxidc.com/go-framework/baize/framework/binding/request"
+	"git.sxidc.com/go-framework/baize/framework/binding/response"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/domain"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure/logger"
+	"git.sxidc.com/go-tools/utils/http_client"
+	"git.sxidc.com/service-supports/fserr"
+	"io"
+	"net/http"
+	"strings"
+	"time"
+)
+
+func (gw *Gateway) BodyMapping(binder *binding.Binder, bodyMapping *BodyMapping, middlewares ...api.Handler) {
+	bodyMapping.bind(binder, gw.httpClient, gw.options.timeoutSec, middlewares...)
+}
+
+type BodyMapping struct {
+	HttpMethod   string
+	RelativePath string
+	ToUrl        string
+
+	BodyMappingFunc func(body []byte) ([]byte, error)
+}
+
+func (bodyMapping *BodyMapping) bind(binder *binding.Binder, httpClient *http_client.Client, timeoutSec int64, middlewares ...api.Handler) {
+	binding.Bind[any](binder, &binding.BindItem[any]{
+		Method: bodyMapping.HttpMethod,
+		SimpleBindItem: &binding.SimpleBindItem[any]{
+			Path:         bodyMapping.RelativePath,
+			ResponseFunc: response.NoResponse,
+			ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
+				body, err := io.ReadAll(c.Request.Body)
+				if err != nil {
+					logger.GetInstance().Error(err)
+					c.AbortWithStatus(http.StatusBadGateway)
+					return nil, err
+				}
+
+				defer func() {
+					err := c.Request.Body.Close()
+					if err != nil {
+						logger.GetInstance().Error(err)
+						c.AbortWithStatus(http.StatusBadGateway)
+					}
+				}()
+
+				if bodyMapping.BodyMappingFunc != nil {
+					newBody, err := bodyMapping.BodyMappingFunc(body)
+					if err != nil {
+						logger.GetInstance().Error(err)
+						c.AbortWithStatus(http.StatusBadGateway)
+						return nil, err
+					}
+
+					body = newBody
+				}
+
+				headers := make(map[string]string)
+				for key, values := range c.Request.Header {
+					headers[key] = strings.Join(values, ",")
+				}
+
+				var httpResponse *http_client.Response
+				httpRequest := httpClient.
+					NewRequest(http_client.WithNewRequestTimeout(time.Duration(timeoutSec) * time.Second))
+
+				switch bodyMapping.HttpMethod {
+				case http.MethodPost:
+					resp, err := httpRequest.Post(bodyMapping.ToUrl, body, http_client.WithRequestHeaders(headers))
+					if err != nil {
+						logger.GetInstance().Error(err)
+						c.AbortWithStatus(http.StatusBadGateway)
+						return nil, err
+					}
+
+					httpResponse = resp
+				case http.MethodPut:
+					resp, err := httpRequest.Put(bodyMapping.ToUrl, body, http_client.WithRequestHeaders(headers))
+					if err != nil {
+						logger.GetInstance().Error(err)
+						c.AbortWithStatus(http.StatusBadGateway)
+						return nil, err
+					}
+
+					httpResponse = resp
+				default:
+					err := fserr.New("不支持Body传递参数")
+					logger.GetInstance().Error(err)
+					c.AbortWithStatus(http.StatusBadGateway)
+					return nil, err
+				}
+
+				c.Status(http.StatusOK)
+
+				_, err = c.Writer.Write(httpResponse.Body())
+				if err != nil {
+					logger.GetInstance().Error(err)
+					c.AbortWithStatus(http.StatusBadGateway)
+					return nil, err
+				}
+
+				c.Writer.Flush()
+
+				return nil, nil
+			},
+		},
+	}, middlewares...)
+}

+ 0 - 64
convenient/gateway/pass_through.go

@@ -1,64 +0,0 @@
-package gateway
-
-import (
-	"git.sxidc.com/go-framework/baize/framework/binding"
-	"git.sxidc.com/go-framework/baize/framework/binding/request"
-	"git.sxidc.com/go-framework/baize/framework/binding/response"
-	"git.sxidc.com/go-framework/baize/framework/core/api"
-	"git.sxidc.com/go-framework/baize/framework/core/domain"
-	"git.sxidc.com/go-framework/baize/framework/core/infrastructure"
-	"net/http"
-)
-
-func (gw *Gateway) PostBindPassThrough(binder *binding.Binder, simple *SimplePassThrough, middlewares ...api.Handler) {
-	simple.bind(binder, http.MethodPost, middlewares...)
-}
-
-func (gw *Gateway) DeleteBindPassThrough(binder *binding.Binder, simple *SimplePassThrough, middlewares ...api.Handler) {
-	simple.bind(binder, http.MethodDelete, middlewares...)
-}
-
-func (gw *Gateway) PutBindPassThrough(binder *binding.Binder, simple *SimplePassThrough, middlewares ...api.Handler) {
-	simple.bind(binder, http.MethodPost, middlewares...)
-}
-
-func (gw *Gateway) GetBindPassThrough(binder *binding.Binder, simple *SimplePassThrough, middlewares ...api.Handler) {
-	simple.bind(binder, http.MethodGet, middlewares...)
-}
-
-func (gw *Gateway) BindPassThrough(binder *binding.Binder, passThrough *PassThrough, middlewares ...api.Handler) {
-	passThrough.bind(binder, middlewares...)
-}
-
-type SimplePassThrough struct {
-	RelativePath string
-	ToUrl        string
-}
-
-func (simple *SimplePassThrough) bind(binder *binding.Binder, httpMethod string, middlewares ...api.Handler) {
-	passThrough := &PassThrough{
-		HttpMethod:        httpMethod,
-		SimplePassThrough: simple,
-	}
-
-	passThrough.bind(binder, middlewares...)
-}
-
-type PassThrough struct {
-	HttpMethod string
-	*SimplePassThrough
-}
-
-func (passThrough *PassThrough) bind(binder *binding.Binder, middlewares ...api.Handler) {
-	binding.Bind[any](binder, &binding.BindItem[any]{
-		Method: passThrough.HttpMethod,
-		SimpleBindItem: &binding.SimpleBindItem[any]{
-			Path:         passThrough.RelativePath,
-			ResponseFunc: response.NoResponse,
-			ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
-				c.Redirect(http.StatusTemporaryRedirect, passThrough.ToUrl)
-				return nil, nil
-			},
-		},
-	}, middlewares...)
-}