V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dzdh
V2EX  ›  Go 编程语言

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

  •  
  •   dzdh · 12 天前 · 1619 次点击

    拿 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}
    }
    
    9 条回复    2024-11-13 10:13:22 +08:00
    ccccqqq
        1
    ccccqqq  
       12 天前   ❤️ 1
    PHPer 不是低级的代名词。

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

    可能 go 唯一麻烦的是得一路 return err ,可以考虑自定义一个兼容 error 的接口然后在 middleware 解析出 error_code 和 message
    dyllen
        4
    dyllen  
       12 天前
    你说对了,要用中间件处理,标准库的路由时没有中间件功能的,要么在自己造,要么用现成的框架。
    kidlj
        5
    kidlj  
       12 天前
    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
        6
    kidlj  
       12 天前
    虽然我喜欢 V2EX ,打算以后再也不在评论区贴代码了,垃圾。
    wen20
        7
    wen20  
       12 天前
    # 评论区没格式吗

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


    可能是担心影响阅读吧。比如万一有人发一堆 # (h1)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6039 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:47 · PVG 10:47 · LAX 18:47 · JFK 21:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.