一个使用Golang的HTTP JSON请求验证器包的例子

42 阅读1分钟

有很多方法来处理/验证HTTP JSON请求,但我将向你展示我在个人项目中通常会使用的方法。

package request

import (
	"encoding/json"
	"io"
	"strings"

	"github.com/pkg/errors"
)

// DecodeJSON decodes json formatted request body into incoming struct. All
// errors contain a response friendly error message.
func DecodeJSON(body io.Reader, input interface{}) error {
	d := json.NewDecoder(body)
	d.DisallowUnknownFields()

	e := d.Decode(input)
	if e != nil {
		var (
			se  *json.SyntaxError
			ute *json.UnmarshalTypeError
		)

		switch {
		case
			errors.Is(e, io.EOF),
			errors.Is(e, io.ErrUnexpectedEOF),
			errors.As(e, &se):
			return errors.New("Malformed JSON payload.")
		case
			errors.As(e, &ute):
			return errors.New("Unexpected field value.")
		case
			strings.HasPrefix(e.Error(), "json: unknown field "):
			return errors.New("Unexpected field key.")
		default:
			return errors.New("Invalid request payload.")
		}
	}

	return nil
}

例子使用

type Body struct {
	Name      string `json:"name"`
	Address   string `json:"address"`
}

var req Body

if err := request.DecodeJSON(body, &req); err != nil {
	return err
}