之前说过 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)
}
就是这么直接明了,没有太多的东西。