怎么优雅的统一返回数据格式(HTTPJSON)

37 天前
 dzdh

拿 php+laravel 来说。任何地方。抛异常。在 exceptionhandler 里就重写返回就行。

go 里边是咋处理的。也是中间件吗?自带的 http.handler 没有自己造个中间件出来?

中间件处理的话。这样?

interface Result { func Ok():any  func Err() Err }
interface Err {func Msg() any      func Code() int }

struct xx {
}
func (x *xx) Ok() any {
    return "xxx"
}

func (x *xx) Err () Err {
     return nil
}

func xx() Result {
   return &xx{sdfasfafa}
}
1925 次点击
所在节点    Go 编程语言
9 条回复
ccccqqq
37 天前
PHPer 不是低级的代名词。

建议仔细阅读 https://learnku.com/docs/guide/smart-questions/2032
如果无法解决,可以尝试访问 https://chatgpt.com/
ninjashixuan
37 天前
你都 php+laravel 那为什么 go 不 + gin/fiber/echo 等等都有 middleware ,不然就自己造轮子了。
aarontian
37 天前
go 大把的框架+中间件,直接用就行了

可能 go 唯一麻烦的是得一路 return err ,可以考虑自定义一个兼容 error 的接口然后在 middleware 解析出 error_code 和 message
dyllen
37 天前
你说对了,要用中间件处理,标准库的路由时没有中间件功能的,要么在自己造,要么用现成的框架。
kidlj
37 天前
Echo 框架:

1. 定义一个 errors package:

package errors

import (
"fmt"
"net/http"

"github.com/labstack/echo/v4"
)

func ERROR(err error, c echo.Context) {
code := http.StatusInternalServerError
message := "Internal Server Error"

if he, ok := err.(*echo.HTTPError); ok {
code = he.Code
message = fmt.Sprint(he.Message)
}

_ = c.JSON(code, echo.Map{
"success": false,
"message": message,
})
}

2. 将 ERROR 函数指定为 Echo 的统一处理函数:

package main

e := echo.New()
e.HTTPErrorHandler = errors.ERROR

3. 在任意 handler 返回 err:

func (h *Handler) createCluster(c echo.Context) error {
payload := &ClusterPayload{}
err := c.Bind(payload)
if err != nil {
return echo.NewHTTPError( http.StatusBadRequest, err.Error())
}
if err := payload.validate(); err != nil {
return echo.NewHTTPError( http.StatusBadRequest, err.Error())
}

cluster, err := h.service.CreateCluster(c.Request().Context(), payload)
if ent.IsConstraintError(err) {
return echo.NewHTTPError( http.StatusBadRequest, err.Error())
}
if err != nil {
fmt.Println(err)
return echo.ErrInternalServerError
}

return c.JSON( http.StatusOK, echo.Map{
"success": true,
"data": cluster,
})
}
kidlj
37 天前
虽然我喜欢 V2EX ,打算以后再也不在评论区贴代码了,垃圾。
wen20
37 天前
# 评论区没格式吗

```
if err != nil {
fmt.Println(err)
return echo.ErrInternalServerError
}
```
daimaosix
37 天前
@kidlj 哈哈哈哈哈哈
dzdh
37 天前
@kidlj #6
@wen20 #7


可能是担心影响阅读吧。比如万一有人发一堆 # (h1)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1088965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX