cronsun/web/base.go

63 lines
1.2 KiB
Go

package web
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"runtime/debug"
"sunteng/commons/log"
)
type BaseHandler struct {
Handle func(w http.ResponseWriter, r *http.Request)
}
func (b BaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer func() {
// handle all the error
err_ := recover()
if err_ == nil {
return
}
var stack string
var buf bytes.Buffer
buf.Write(debug.Stack())
stack = buf.String()
outJSONError(w, http.StatusInternalServerError, "Internal Server Error")
log.Errorf("%v\n\n%s\n", err_, stack)
return
}()
b.Handle(w, r)
}
func outJSONWithCode(w http.ResponseWriter, httpCode int, data interface{}) {
w.Header().Set("Content-Type", "application/json")
s := ""
b, err := json.Marshal(data)
if err != nil {
s = `{"error":"json.Marshal error"}`
w.WriteHeader(http.StatusInternalServerError)
} else {
s = string(b)
w.WriteHeader(httpCode)
}
fmt.Fprint(w, s)
}
func outJSON(w http.ResponseWriter, data interface{}) {
outJSONWithCode(w, http.StatusOK, data)
}
func outJSONError(w http.ResponseWriter, httpCode int, msg string) {
r := map[string]string{
"error": msg,
}
outJSONWithCode(w, httpCode, r)
}