Jas HijackWrite自定义返回格式
jas的Context中,通过为HijackWrite加入自定义的函数,可以用来改变返回的结构。
问题
原来的默认固定返回结构是:
{"data":...,"error":...}
这样的结构如果需要更好的信息展示的话,肯定不太方便。
如果需要自定义的数据的话,则利用HijackWrite,自定义数据。
方法
在使用的jas.Router.Config中有:
HijackWrite func(io.Writer, *Context) int
来看看在没有实现这个函数的时候,jas是如何处理返回的:
// context.go
var resp Response
resp.Data = ctx.Data
if ctx.Error != nil {
ctx.Status = ctx.Error.Status()
resp.Error = ctx.Error.Message()
}
var written int
if ctx.config.HijackWrite != nil {
ctx.responseWriter.WriteHeader(ctx.Status)
written = ctx.config.HijackWrite(ctx.writer, ctx)
} else {
jsonBytes, _ := json.Marshal(resp)
if ctx.Callback != "" { // handle JSONP
if ctx.written == 0 {
ctx.ResponseHeader.Set("Content-Type", "application/javascript; charset=utf-8")
ctx.responseWriter.WriteHeader(ctx.Status)
}
a, _ := ctx.writer.Write([]byte(ctx.Callback + "("))
b, _ := ctx.writer.Write(jsonBytes)
c, _ := ctx.writer.Write([]byte(");"))
written = a + b + c
} else {
if ctx.written == 0 {
ctx.responseWriter.WriteHeader(ctx.Status)
written, _ = ctx.writer.Write(jsonBytes)
} else if resp.Data != nil || resp.Error != nil {
written, _ = ctx.writer.Write(jsonBytes)
}
}
}
用户默认返回的都存在resp.Data中,error存放在resp.Error中,再解析成JSON数据。 只要自定义结构,JSON解析后,用ctx.writer.Write函数写入即可
router.Config.HijackWrite = func(writer io.Writer, ctx *jas.Context) int {
var written int
if ctx.Error != nil {
resp := &Response{
Code: int32(ctx.Error.Status()),
Desc: ctx.Error.Message(),
}
jsonBytes, _ := json.Marshal(resp)
written, _ = writer.Write(jsonBytes)
} else {
written, _ = writer.Write([]byte(reflect.ValueOf(ctx.Data).String()))
}
return written
}
这样的话,自定义下来的返回结构可以这样的:
// 发现错误时返回
{"status":...,"error":...}
// 正常返回
{"data":...}
注意
jas已长时间未更新,推荐使用现在仍在维护、流行的Web框架。