From 9113fc5297113f5f7da433d6025a15036ce15d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=B8=85?= <133814250@qq.com> Date: Mon, 3 Jul 2023 20:31:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- .../images/sys-middleware-com-response.png | Bin 0 -> 10347 bytes docs/guide-zh-CN/sys-catalog.md | 4 +- docs/guide-zh-CN/sys-middleware.md | 46 +++++++++++++++++- server/api/api/pay/notify.go | 2 +- server/internal/library/response/response.go | 34 ++++++++++++- server/internal/logic/middleware/response.go | 13 +---- server/manifest/config/config.example.yaml | 2 +- web/src/views/about/index.vue | 2 +- 9 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 docs/guide-zh-CN/images/sys-middleware-com-response.png diff --git a/README.md b/README.md index 29a1723..bd68f71 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ ## 平台简介 -* 基于全新Go Frame 2+Vue3+Naive UI+UinApp开发的全栖框架,为二次开发而生,适合中小型完整应用开发。 -* 前端采用Naive-Ui-Admin、Vue、Naive UI、UinApp。 +* 基于全新Go Frame 2+Vue3+Naive UI+uniapp开发的全栖框架,为二次开发而生,适合中小型完整应用开发。 +* 前端采用Naive-Ui-Admin、Vue、Naive UI、uniapp。 ## 演示地址 - [https://hotgo.facms.cn/admin](https://hotgo.facms.cn/admin) diff --git a/docs/guide-zh-CN/images/sys-middleware-com-response.png b/docs/guide-zh-CN/images/sys-middleware-com-response.png new file mode 100644 index 0000000000000000000000000000000000000000..86e86d0a5faabb4db16e1b6a7d230958ba3d7005 GIT binary patch literal 10347 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 literal 0 HcmV?d00001 diff --git a/docs/guide-zh-CN/sys-catalog.md b/docs/guide-zh-CN/sys-catalog.md index 7a0cd44..e61d0a5 100644 --- a/docs/guide-zh-CN/sys-catalog.md +++ b/docs/guide-zh-CN/sys-catalog.md @@ -4,7 +4,7 @@ - 服务端 - web前端 -- uinapp端(待开放) +- uniapp端(待开放) #### 服务端 @@ -169,7 +169,7 @@ ``` -#### uinapp端 +#### uniapp端 ``` // 待开放 ``` \ No newline at end of file diff --git a/docs/guide-zh-CN/sys-middleware.md b/docs/guide-zh-CN/sys-middleware.md index fa8f7a8..01deb94 100644 --- a/docs/guide-zh-CN/sys-middleware.md +++ b/docs/guide-zh-CN/sys-middleware.md @@ -73,9 +73,50 @@ func main() { - 文件路径:server/internal/logic/middleware/response.go +#### 常用响应类型 + +- hotgo为一些常用的响应类型做了统一格式封装,例如:`application/json`、`text/xml`、`text/html`、`text/event-stream`等,默认使用`application/json`。 +- 下面我们以`text/xml`为例简单演示几种使用方法: + +1. 当你使用规范化路由时,可直接在XxxRes结构体的`g.Meta`中声明响应类型: +```go +type HelloReq struct { + g.Meta `path:"/hello" tags:"Hello" method:"get" summary:"You first hello api"` + Name string `json:"name" d:"hotgo" dc:"名字"` +} + +type HelloRes struct { + g.Meta `mime:"text/xml" type:"string"` + Tips string `json:"tips"` +} +``` + +2. 在响应前设置响应头: +```go +var ( + Hello = cHello{} +) + +type cHello struct{} + +func (c *cHello) Hello(ctx context.Context, req *user.HelloReq) (res *user.HelloRes, err error) { + r := ghttp.RequestFromCtx(ctx) + r.Response.Header().Set("Content-Type", "text/xml") + + res = &user.HelloRes{ + Tips: fmt.Sprintf("hello %v, this is the api for %v applications.", req.Name, simple.AppName(ctx)), + } + return +} +``` + +- 浏览器中访问响应内容如下: + ![./images/sys-middleware-com-response.png](./images/sys-middleware-com-response.png) + + #### 自定义响应 -- 由于响应中间件是全局的,并且是统一使用json格式进行响应的,但是在实际的开发中可能存在一些需要使用非json格式的响应,所以你需要进行单独的处理。 -- 推荐以下几种处理方式,可做参考: +- 在实际开发中,可能需要使用自定义的响应类型,由于响应中间件是全局的,因此您需要对其进行单独处理。 +- 推荐以下几种处理方案,可做参考: 1. 使用`ghttp.ExitAll()`,需要注意的是此方法会终止后续所有的http处理 ```go @@ -102,6 +143,7 @@ func main() { 2. 在`server/internal/logic/middleware/response.go`中根据请求的独有特征进行单独的处理,兼容后续http处理。 + #### 重写响应错误提示 - 在实际开发中,我们可能想要隐藏一些敏感错误,返回给客户端友好的错误提示,但开发者同时又想需要看到真实的敏感错误。对此hotgo已经进行了过滤处理,下面是一个简单的例子: diff --git a/server/api/api/pay/notify.go b/server/api/api/pay/notify.go index dd82e68..005a0c3 100644 --- a/server/api/api/pay/notify.go +++ b/server/api/api/pay/notify.go @@ -28,6 +28,6 @@ type NotifyQQPayReq struct { } type NotifyQQPayRes struct { - g.Meta `mime:"text/xml" type:"string" example:""` + g.Meta `mime:"text/xml" type:"string"` payin.PayNotifyModel } diff --git a/server/internal/library/response/response.go b/server/internal/library/response/response.go index 1071c21..f1b33ea 100644 --- a/server/internal/library/response/response.go +++ b/server/internal/library/response/response.go @@ -10,9 +10,9 @@ import ( "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" "hotgo/internal/library/contexts" "hotgo/internal/model" - "time" ) // JsonExit 返回JSON数据并退出当前HTTP执行函数 @@ -21,6 +21,36 @@ func JsonExit(r *ghttp.Request, code int, message string, data ...interface{}) { r.Exit() } +// RXml xml +func RXml(r *ghttp.Request, code int, message string, data ...interface{}) { + responseData := interface{}(nil) + if len(data) > 0 { + responseData = data[0] + } + res := &model.Response{ + Code: code, + Message: message, + Timestamp: gtime.Timestamp(), + TraceID: gctx.CtxId(r.Context()), + } + + // 如果不是正常的返回,则将data转为error + if gcode.CodeOK.Code() == code { + res.Data = responseData + } else { + res.Error = responseData + } + + // 清空响应 + r.Response.ClearBuffer() + + // 写入响应 + r.Response.WriteXml(gconv.Map(res)) + + // 加入到上下文 + contexts.SetResponse(r.Context(), res) +} + // RJson 标准返回结果数据结构封装 func RJson(r *ghttp.Request, code int, message string, data ...interface{}) { responseData := interface{}(nil) @@ -30,7 +60,7 @@ func RJson(r *ghttp.Request, code int, message string, data ...interface{}) { res := &model.Response{ Code: code, Message: message, - Timestamp: time.Now().Unix(), + Timestamp: gtime.Timestamp(), TraceID: gctx.CtxId(r.Context()), } diff --git a/server/internal/logic/middleware/response.go b/server/internal/logic/middleware/response.go index 3bf2a4b..3388061 100644 --- a/server/internal/logic/middleware/response.go +++ b/server/internal/logic/middleware/response.go @@ -36,7 +36,6 @@ func (s *sMiddleware) ResponseHandler(r *ghttp.Request) { s.responseXml(r) return case consts.HTTPContentTypeStream: - // ... default: responseJson(r) } @@ -56,16 +55,8 @@ func (s *sMiddleware) responseHtml(r *ghttp.Request) { // responseXml xml响应 func (s *sMiddleware) responseXml(r *ghttp.Request) { - code, message, resp := parseResponse(r) - r.Response.ClearBuffer() - r.Response.Write(``) - - switch code { - case gcode.CodeOK.Code(): - r.Response.WriteXml(g.Map{"code": code, "message": message, "data": resp}) - default: - r.Response.WriteXml(g.Map{"code": code, "message": message, "error": resp}) - } + code, message, data := parseResponse(r) + response.RXml(r, code, message, data) return } diff --git a/server/manifest/config/config.example.yaml b/server/manifest/config/config.example.yaml index 52ac4fa..7d0ea14 100644 --- a/server/manifest/config/config.example.yaml +++ b/server/manifest/config/config.example.yaml @@ -127,7 +127,7 @@ viewer: setting: title: "HotGo" keywords: "中后台解决方案,gf框架,vue3" - description: "hotgo 是一个基于 goframe2,vue3,vite2,TypeScript,uinapp 的中后台解决方案,它可以帮助你快速搭建企业级中后台项目,相信不管是从新技术使用还是其他方面,都能帮助到你,持续更新中。" + description: "hotgo 是一个基于 goframe2,vue3,vite2,TypeScript,uniapp 的中后台解决方案,它可以帮助你快速搭建企业级中后台项目,相信不管是从新技术使用还是其他方面,都能帮助到你,持续更新中。" # 路由配置 diff --git a/web/src/views/about/index.vue b/web/src/views/about/index.vue index d6733b5..77fd041 100644 --- a/web/src/views/about/index.vue +++ b/web/src/views/about/index.vue @@ -2,7 +2,7 @@
- {{ name }} 是一个基于 goframe2,vue3,vite2,TypeScript,uinapp + {{ name }} 是一个基于 goframe2,vue3,vite2,TypeScript,uniapp 的中后台解决方案,它可以帮助你快速搭建企业级中后台项目,相信不管是从新技术使用还是其他方面,都能帮助到你,持续更新中。