五步用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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!