响应

未匹配的标注

响应

响应服务

响应服务由 services/response/response.go 提供.

结构体是 response.Service.

该结构体实现了 services.ResponseService 接口.

响应内容[响应挂载体]

主要内容是 app/responses 包下的定义.

初始根据 Http 400 状态码定义一些常用的异常方法

Ok(args ...any) services.Response // 200
Created(args ...any) services.Response // 201
Accepted(args ...any) services.Response // 202
NonAuthoritative(args ...any) services.Response // 203
NoContent(args ...any) services.Response // 204
ResetContent(args ...any) services.Response // 205

方法名就是状态码的状态文本.

响应体这些状态码只作用在 httpStatus 上, json code 永远是 0

定义这些方法, 本质区别就是返回响应体时, 设置的 httpStatus 不一样而已. json code 永远是 0

为什么叫挂载体

因为响应服务提供者在注册响应服务的时候, 需要将响应内容绑定到响应服务上, 这样做的目的是把通用复杂以及不怎么修改的方法定义在服务上, 简单常用的方法以及经常修改的方法定义在挂载体上, 这样我们在使用响应服务的时候, 只需要更改 app/responses 下的代码就可以了.

下面是提供者的注册代码:

r := new(responses.Response)
return response.Mount(r).Init(ss...)

重点: 服务提供者实际提供的响应服务是 *responses.Respoonse, 这样做无需修改 services.ResponseService 接口, 即可使用上面说明的那些 20x 的方法

如何使用

具体使用

package controllers

import (
    "gower/app"
    "gower/services"
    "github.com/gin-gonic/gin"
)

type UploadController struct {
    app.Controller
}

var Upload = new(UploadController)

// Image 上传图片
func (*UploadController) Image(c *gin.Context) (services.Response, error) {
    path, url, err := upload.Image(c)
    if err != nil {
        return nil, excp.BadRequest(err)
    }

    // 直接调用响应体的方法, 返回 services.Response 即可
    return res.Created("上传成功", app.Data{
        "path": path,
        "url":  url,
    }), nil
}

关于参数

与异常的说法一样的

修改响应挂载体

响应内容

app/responses/response.go

// Response 非 HTML 请求的成功响应体
type Response struct {
    *response.Service `json:"-"`
    Code              int    `json:"code"`
    Msg               string `json:"msg"`
    Data              any    `json:"data"`
    Token             string `json:"token"`
}

// Set 设置响应体内容, 不设置 Code, 默认就是 0, 表示成功
func (r *Response) Set(arg any) services.Response {
    switch arg.(type) {
    case *response.Service:
        r.Service = arg.(*response.Service)
    case *Response:
        r.Service.Response = r
    case string:
        s := arg.(string)
        if r.IsToken(s) {
            r.Token = s
            break
        }
        r.Msg = s
    default:
        r.Data = arg
    }
    return r
}

修改规则同异常

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~