五步用golang封装自己web框架httper:第四步,实现Context
封装http.ResponseWriter和http.Request常用方法,这里只实现部分方法,可以通过实现Context接口实现更多功能,Handle()方法用于中间件中调用下一个Handler。
http.go
type Context interface {
Writer() http.ResponseWriter WriteHeader(status int)
JSON(status int, data any) error
Error(status int, err error) error
Request() *http.Request URLPath() string
Method() string PathValue(name string) string
BindJson(v any) error
Handle(handler http.Handler)
}
这里NewContext方法为下一课实现各种处理方法打下基础
type context struct {
writer http.ResponseWriter
request *http.Request
}
func NewContext(w http.ResponseWriter, r *http.Request) Context {
return &context{ writer: w, request: r, }
}
func (c *context) Writer() http.ResponseWriter {
return c.writer
}
func (c *context) WriteHeader(status int) {
c.writer.WriteHeader(status)
}
func (c *context) JSON(status int, data any) error {
body, err := json.Marshal(data)
if err != nil{
return err
}
c.writer.WriteHeader(status)
c.writer.Header().Set("Content-Type", "application/json; charset=utf-8")
_,err = io.Copy(c.writer, bytes.NewReader(body))
return err
}
func (c *context) Error(status int, err error) error {
http.Error(c.writer, err.Error(), status)
return nil
}
func (c *context) Request() *http.Request {
return c.request
}
func (c *context) URLPath() string {
return c.request.URL.Path
}
func (c *context) Method() string {
return c.request.Method
}
func (c *context) PathValue(name string) string {
return c.request.PathValue(name)
}
func (c *context) BindJson(v any) error {
body, err := io.ReadAll(c.Request().Body)
if err != nil {
return err
}
return json.Unmarshal(body, v)
}
func (c *context) Handle(handler http.Handler) {
handler.ServeHTTP(c.writer, c.request)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接