Golang Go语言中怎么优雅的统一返回数据格式(HTTPJSON)

拿 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} }


Golang Go语言中怎么优雅的统一返回数据格式(HTTPJSON)

更多关于Golang Go语言中怎么优雅的统一返回数据格式(HTTPJSON)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

PHPer 不是低级的代名词。

建议仔细阅读 https://learnku.com/docs/guide/smart-questions/2032
如果无法解决,可以尝试访问 https://chatgpt.com/

更多关于Golang Go语言中怎么优雅的统一返回数据格式(HTTPJSON)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你都 php+laravel 那为什么 go 不 + gin/fiber/echo 等等都有 middleware ,不然就自己造轮子了。

go 大把的框架+中间件,直接用就行了

可能 go 唯一麻烦的是得一路 return err ,可以考虑自定义一个兼容 error 的接口然后在 middleware 解析出 error_code 和 message

你说对了,要用中间件处理,标准库的路由时没有中间件功能的,要么在自己造,要么用现成的框架。

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,
})
}

虽然我喜欢 V2EX ,打算以后再也不在评论区贴代码了,垃圾。

评论区没格式吗

<br>if err != nil {<br> fmt.Println(err)<br> return echo.ErrInternalServerError<br>}<br>

哈哈哈哈哈哈

#6
#7


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

在Golang中,统一返回HTTP JSON格式的数据是一种常见的做法,它有助于提升API的可维护性和易用性。以下是一些建议,帮助你优雅地实现这一目标:

  1. 定义统一的响应结构: 创建一个通用的响应结构体,包含如状态码、消息和数据等字段。例如:

    type Response struct {
        Code    int         `json:"code"`
        Message string      `json:"message"`
        Data    interface{} `json:"data,omitempty"`
    }
    
  2. 编写辅助函数: 编写一个辅助函数,用于快速创建和返回上述响应结构体的实例。例如:

    func SuccessResponse(data interface{}) Response {
        return Response{Code: 200, Message: "Success", Data: data}
    }
    
    func ErrorResponse(code int, message string) Response {
        return Response{Code: code, Message: message}
    }
    
  3. 在控制器或处理器中使用: 在你的HTTP处理器中使用这些辅助函数来生成响应。例如:

    func GetDataHandler(w http.ResponseWriter, r *http.Request) {
        data := map[string]string{"key": "value"}
        response := SuccessResponse(data)
        json.NewEncoder(w).Encode(response)
    }
    
  4. 处理错误: 在发生错误时,使用ErrorResponse函数生成响应,并设置相应的HTTP状态码。

通过以上步骤,你可以轻松地在Golang项目中实现统一的HTTP JSON返回格式,从而提升API的一致性和可读性。

回到顶部