美文网首页Go语言的不归路
gin HTTP响应格式统一处理

gin HTTP响应格式统一处理

作者: 吴佳浩 | 来源:发表于2023-07-20 15:40 被阅读0次

在gin框架中,我们可以定义一个中间件来处理统一的HTTP响应格式。该中间件将在将响应发送给客户端之前拦截响应,并根据你指定的格式进行格式化。


以下是创建用于处理统一HTTP响应格式的Gin中间件的示例:

1.首先定义好返回数据的结构

···

package middleware

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

// ResponseData 表示统一响应的JSON格式
type ResponseData struct {
    Code    int         `json:"code"`    // 状态码
    Message string      `json:"message"` // 响应消息
    Data    interface{} `json:"data"`    // 响应数据
}

在这个示例中,我们定义了一个ResponseData结构体来表示JSON响应格式。

  • Code字段用于表示HTTP状态码,指示请求处理的结果,例如200表示成功,404表示未找到等。
  • Message字段是一个字符串,用于描述响应的消息或错误信息,让前端或API调用者能够理解响应的含义。
  • Data字段是一个空接口(interface{}),用于存储响应的数据。根据具体情况,可以将任何类型的数据赋值给Data字段,以便传递给前端或API调用者。

这个ResponseData结构体在Gin统一HTTP响应格式中间件中用于创建响应数据,并以JSON格式发送给客户端。通过统一的结构体定义,可以确保应用程序的响应格式一致性,方便维护和理解。

2.接下来在上述文件的基础之上创建一个用于处理错误响应的方法:
// ErrorResponse 是一个辅助函数,用于创建错误响应
// 参数:
//   c *gin.Context:Gin上下文对象,用于处理HTTP请求和响应
//   code int:HTTP状态码,表示请求处理的结果
//   message string:响应消息,用于描述响应的错误信息或提示信息
func ErrorResponse(c *gin.Context, code int, message string) {
    c.JSON(code, ResponseData{
        Code:    code,
        Message: message,
        Data:    nil,
    })
}

ErrorResponse是一个辅助函数,用于创建错误响应。它接收三个参数:

  • c *gin.Context:Gin上下文对象,用于处理HTTP请求和响应。通过该参数,我们可以通过c.JSON()方法将JSON格式的响应发送给客户端。
  • code int:HTTP状态码,表示请求处理的结果。根据HTTP标准,状态码为2xx表示成功,4xx表示客户端错误,5xx表示服务器错误,例如200表示成功,404表示未找到,500表示服务器内部错误等。
  • message string:响应消息,用于描述响应的错误信息或提示信息。可以根据具体的业务需求自定义消息内容。

ErrorResponse函数会根据传入的参数,创建一个ResponseData结构体,并将其以JSON格式发送给客户端作为响应。Data字段在此处设置为nil,因为错误响应通常不需要返回具体的数据,只需提供错误信息即可。

3.失败是成功之母,好了,那我们继续在上面母文件上继续添加处理成功响应的方法
// SuccessResponse 是一个辅助函数,用于创建成功响应
// 参数:
//   c *gin.Context:Gin上下文对象,用于处理HTTP请求和响应
//   code int:HTTP状态码,表示请求处理的结果
//   data interface{}:响应数据,用于描述请求处理成功后返回的具体数据
func SuccessResponse(c *gin.Context, code int, data interface{}) {
    c.JSON(code, ResponseData{
        Code:    code,
        Message: "成功",
        Data:    data,
    })
}

SuccessResponse是一个辅助函数,用于创建成功响应。它接收三个参数:

  • c *gin.Context:Gin上下文对象,用于处理HTTP请求和响应。通过该参数,我们可以通过c.JSON()方法将JSON格式的响应发送给客户端。
  • code int:HTTP状态码,表示请求处理的结果。根据HTTP标准,状态码为2xx表示成功,4xx表示客户端错误,5xx表示服务器错误,例如200表示成功,404表示未找到,500表示服务器内部错误等。
  • data interface{}:响应数据,用于描述请求处理成功后返回的具体数据。可以是结构体、数组、切片等任何Go语言中支持的数据类型。

SuccessResponse函数会根据传入的参数,创建一个ResponseData结构体,并将其以JSON格式发送给客户端作为响应。Message字段在此处设置为"成功",表示请求处理成功,同时将具体的数据放入Data字段中返回给客户端。

4.好了上面的母子方法都有了,那我们就在写一个强壮一点的核心方法,可以理解成这个方法是这个中间件的出口方法,简称父方法,我们继续在上面的文件中添加
// UnifiedResponseMiddleware 是处理统一HTTP响应格式的中间件
// 该中间件将在将响应发送给客户端之前拦截响应,并根据你指定的格式进行格式化。

// 返回值:
//   gin.HandlerFunc:Gin中间件处理函数

func UnifiedResponseMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()

        // 检查是否在处理请求时发生了错误
        // 如果发生了错误,通过ErrorResponse函数创建一个错误响应,并返回给客户端
        if len(c.Errors) > 0 {
            err := c.Errors.Last()
            ErrorResponse(c, http.StatusInternalServerError, err.Error())
            return
        }

        // 检查是否设置了响应状态码
        // 如果未设置响应状态码,默认将状态码设置为200(OK)
        if c.Writer.Status() == 0 {
            c.Writer.WriteHeader(http.StatusOK)
        }

        // 如果没有错误,则格式化响应
        // 检查是否设置了"response_data"键的值,如果有,则调用SuccessResponse函数创建一个成功响应,并返回给客户端
        if c.Writer.Status() >= http.StatusOK && c.Writer.Status() < http.StatusMultipleChoices {
            data, exists := c.Get("response_data")
            if exists {
                SuccessResponse(c, c.Writer.Status(), data)
                return
            }
        }
    }
}

UnifiedResponseMiddleware函数是处理统一HTTP响应格式的中间件。它返回一个gin.HandlerFunc类型的处理函数,该函数将在每次HTTP请求处理结束后被调用。

在处理函数中,我们首先调用c.Next()继续处理HTTP请求。然后,我们检查是否在处理请求时发生了错误,如果有错误,通过ErrorResponse函数创建一个错误响应,并将错误信息返回给客户端。

接着,我们检查是否设置了响应状态码,如果未设置,则默认将状态码设置为200(OK)。

最后,我们检查是否设置了"response_data"键的值,如果有,则调用SuccessResponse函数创建一个成功响应,并将具体的数据返回给客户端。这样,我们就实现了统一的HTTP响应格式处理,保证了应用程序中响应的一致性和标准化。

6.完整的文件middleware.go

在这个示例中,我们定义了一个ResponseData结构体来表示JSON响应格式,以及两个辅助函数ErrorResponseSuccessResponse来方便地创建错误和成功的响应。

UnifiedResponseMiddleware函数是真正处理统一响应格式的中间件。它会检查请求处理过程中是否发生了错误,检查响应状态码是否已设置,然后根据需要格式化响应。

要在你的Gin应用程序中使用这个中间件,你可以将它作为一个中间件添加到你的路由组中:

package middleware

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

type ResponseData struct {
    Code    int         `json:"code"`
    Message string      `json:"message"`
    Data    interface{} `json:"data"`
}

// ErrorResponse是一个辅助函数,用于创建错误响应
func ErrorResponse(c *gin.Context, code int, message string) {
    c.JSON(code, ResponseData{
        Code:    code,
        Message: message,
        Data:    nil,
    })
}

// SuccessResponse是一个辅助函数,用于创建成功响应
func SuccessResponse(c *gin.Context, code int, data interface{}) {
    c.JSON(code, ResponseData{
        Code:    code,
        Message: "成功",
        Data:    data,
    })
}

// UnifiedResponseMiddleware是处理统一HTTP响应格式的中间件
func UnifiedResponseMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()

        // 检查是否在处理请求时发生了错误
        if len(c.Errors) > 0 {
            err := c.Errors.Last()
            ErrorResponse(c, http.StatusInternalServerError, err.Error())
            return
        }

        // 检查是否设置了响应状态码
        if c.Writer.Status() == 0 {
            c.Writer.WriteHeader(http.StatusOK)
        }

        // 如果没有错误,则格式化响应
        if c.Writer.Status() >= http.StatusOK && c.Writer.Status() < http.StatusMultipleChoices {
            data, exists := c.Get("response_data")
            if exists {
                SuccessResponse(c, c.Writer.Status(), data)
                return
            }
        }
    }
}
7.使用这个中间件

要在你的Gin应用程序中使用这个中间件,你可以将它作为一个中间件添加到你的路由组中:

package main

import (
    "github.com/gin-gonic/gin"
    "your-app/middleware"
)

func main() {
    r := gin.Default()

    // 使用统一响应中间件
    r.Use(middleware.UnifiedResponseMiddleware())

    // 在这里定义你的路由和处理程序

    r.Run(":8080")
}

现在,每当你在处理程序中使用c.JSON()时,中间件将拦截响应并根据ResponseData结构体中定义的统一响应格式进行格式化。这样,你的应用程序中就可以保持一致和标准化的响应格式了。

相关文章

  • Gin-处理http请求

    使用Handle方法统一处理http请求 使用Gin的分类处理来处理http请求

  • http协议

    1-http 数据结构 http 请求格式:(请求与响应有细微的差别) http 响应格式 抓取包: 2-http...

  • Android 基础之网络

    HTTP Http报文 http报文可以分为请求报文和响应报文。请求报文格式: 响应报文格式: 解释下各个标签: ...

  • OkHttp3简单使用教程(一):请求和响应

    一,HTTP请求、响应报文格式 要弄明白网络框架,首先需要先掌握Http请求的,响应的报文格式。 HTTP请求报文...

  • SpringBoot2.0实战 | 第九章:SpringBoot

    课程目标 对 SpringBoot 项目中的所有异常进行响应,处理成统一的格式输出。 操作步骤 添加依赖 添加 s...

  • golang+gin实现文件下载GET接口API

    golang+gin 实现文件下载GET接口api 1.api接口格式http://ip:port/downloa...

  • 微服务架构统一异常处理规范

    1. 统一使用ResponseEntity类 : 用于统一响应格式 使用org.springframework.h...

  • response

    目标:使用Gin框架开发接口,返回响应结构封装,统一管理。 封装返回响应的字段结构 封装通用错误代码 封装系统级错...

  • HTTP协议和socket连接

    HTTP的格式 HTTP请求、响应报文格式 HTTP请求行、请求头、请求体详解 TCP连接、HTTP连接与Sock...

  • THHP协议课程第三小节

    HTTP响应的格式 1.状态行 status line 基本格式:HTTP[版本号] [状态码] [状态信息]比如...

网友评论

    本文标题:gin HTTP响应格式统一处理

    本文链接:https://www.haomeiwen.com/subject/skkzudtx.html