去写
net/http的一个简单、干净的HTTP响应生成器。这个包是特意设计的,非常轻巧和简单。没有外部依赖,只有一个真正干净的方法来编写处理程序。
使用方法
你可以使用构建器或代码生成的函数与这个包交互。它们的行为是一样的。
代码生成的函数只是为你调用构建器,它们只是为了方便你。
响应类型
目前有4种不同的方式可以用go-write来结束响应。
字节
你可以使用go-write发送原始字节,它将简单地将字节复制到正文中,并发送带有Content-Length 头的HTTP状态代码:
err := write.New(w, http.StatusTeapot).Bytes([]byte("abc123"))
空
你可以使用go-write发送空响应,主体将是空的,并且只发送HTTP状态码:
err := write.New(w, http.StatusTeapot).Empty()
JSON
Content-Type:application/json; charset=utf-8
你可以使用go-write发送JSON响应,主体将是Marshalled JSON,它将设置相应的Content-Type 和Content-Length 标头,并发送你的HTTP状态代码。
type myBody struct {
Key string `json:"key"`
Value string `json:"value"`
}
err := write.New(w, http.StatusTeapot).JSON(&myBody{
Key: "foo",
Value: "bar",
})
文本
Content-Type:text/plain; charset=utf-8
你可以使用go-write发送纯文本响应,它将简单地复制文本到正文,设置Content-Type 和Content-Length 头,并发送你的HTTP状态码:
err := write.New(w, http.StatusTeapot).Text("example text!")
使用构建器
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/aidenwallis/go-write/write"
)
func main() {
srv := &http.Server{
Addr: ":1234",
Handler: http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
if err := write.New(w, http.StatusTeapot).Text("This handler is indeed a teapot..."); err != nil {
log.Println("Failed to handle HTTP response: " + err.Error())
}
}),
}
defer srv.Shutdown(context.Background())
go func() {
log.Println("Server running.")
_ = srv.ListenAndServe()
}()
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
<-c
}
使用代码生成的函数
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/aidenwallis/go-write/write"
)
func main() {
srv := &http.Server{
Addr: ":1234",
Handler: http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
if err := write.Teapot(w).Text("This handler is indeed a teapot..."); err != nil {
log.Println("Failed to handle HTTP response: " + err.Error())
}
}),
}
defer srv.Shutdown(context.Background())
go func() {
log.Println("Server running.")
_ = srv.ListenAndServe()
}()
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
<-c
}