Write the Code. Change the World.

11月 26

之前说过 request 和 response。但是,没具体设计结构。作为接口开发,定义和 response 结构,对前端或 c 端而言,是很重要的。

操作一波

先定义错误 code 和 message

# app/response/errors.go

package response

type Error struct {
    code    int
    message string
}

var (
    OK                     = Error{0, "ok"}
    SYSTEM_ERROR           = Error{100000, "系统错误"}
    PARAMS_ERROR           = Error{100001, "参数错误"}
    ACCOUNT_PASSWORD_ERROR = Error{100020, "账号密码错误"}
)

因为常量不支持结构体对象,只能用 var 了。在使用的地方直接用 response.SYSTEM_ERROR 这样就可以返回一个 Error 对象了。

再来定义 response 对象

# app/response/api.go

package response

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

// 成功结构
func Success(data interface{}) Response {

    return Response{Data: data}
}

// 失败
func Fail(error Error, errors interface{}) Response {
    code, message := error.code, error.message

    return Response{Code: code, Message: message, Errors: errors}
}

// 对 success 的处理
// success 总是会返回 code 为 0,message  和 errors 为 null 的数据,其为默认值

// 对 fail 的处理,可能存在下边的格式
// errors 可能存在下边的情况
// errors := map[string]string{"filed1":"field1不能为空", "field2":"field2 长度不能超过 32 位"}  在表单提交的时候,对应到具体的 input 框的时候,比较好用
// errors := []string{"账号密码错误"} 在请求 api 的时候,不需要对应 input 框这样的场景
// errors := nil 不需要展示到页面里
// message message 不为 nil 时候,可以作为 message 提示信息飘一下

上边已经有了简要说明,自定义就是这么直接明了,也不需要绕弯子。

怎么使用呢

上边 response 的 Success 和 Fail 方法,其实,就是对数据的一个包装,形成一个完整的数据结构,有 code,message, data, errors 这几个对象。结构统一。 最终输出还是用到 iris.Context 对象的 JSON 方法进行输出。

# app/http/controller/api/user_controller.go 某控制器

type UserController struct {
    Controller
}

type User struct {
    Nickname string `json:"nickname"  validate:"required"`
    Gender   int    `json:"gender" validate:"gte=0,lte=2"`
    Email    string `json:"email" validate:"required,email"`
}

func (c *UserController) Get(ctx *iris.Context) {
    var data response.Response
    judge := rand.Intn(10)
    if judge < 5 {
        user := User{"给我一个理由忘记", 2,"admin@go.com"}
        data = response.Success(user)
        ctx.StatusCode(200)
    } else {
        errors := map[string]string {"name": "用户名不能为空", "phone": "手机号码格式错误"}
        data = response.Fail(response.SYSTEM_ERROR, errors)
        ctx.StatusCode(403)
    }
    ctx.JSON(data)
}

就是这么直接明了,没有太多的东西。

发表评论

电子邮件地址不会被公开。 必填项已用*标注