一个简单干净的Golang HTTP响应编写器(附代码示例)

114 阅读2分钟

去写

codecov Go Reference

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-TypeContent-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-TypeContent-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
}