feat: rest validation on http requests (#3041)
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/mapping"
|
||||
"github.com/zeromicro/go-zero/core/validation"
|
||||
"github.com/zeromicro/go-zero/rest/internal/encoding"
|
||||
"github.com/zeromicro/go-zero/rest/internal/header"
|
||||
"github.com/zeromicro/go-zero/rest/pathvar"
|
||||
@@ -51,7 +52,9 @@ func Parse(r *http.Request, v any) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if val := validator.Load(); val != nil {
|
||||
if valid, ok := v.(validation.Validator); ok {
|
||||
return valid.Validate()
|
||||
} else if val := validator.Load(); val != nil {
|
||||
return val.(Validator).Validate(r, v)
|
||||
}
|
||||
|
||||
|
||||
@@ -354,6 +354,14 @@ func TestParseWithValidatorWithError(t *testing.T) {
|
||||
assert.Error(t, Parse(r, &v))
|
||||
}
|
||||
|
||||
func TestParseWithValidatorRequest(t *testing.T) {
|
||||
SetValidator(mockValidator{})
|
||||
var v mockRequest
|
||||
r, err := http.NewRequest(http.MethodGet, "/a?&age=18", http.NoBody)
|
||||
assert.Nil(t, err)
|
||||
assert.Error(t, Parse(r, &v))
|
||||
}
|
||||
|
||||
func BenchmarkParseRaw(b *testing.B) {
|
||||
r, err := http.NewRequest(http.MethodGet, "http://hello.com/a?name=hello&age=18&percent=3.4", http.NoBody)
|
||||
if err != nil {
|
||||
@@ -410,3 +418,15 @@ func (m mockValidator) Validate(r *http.Request, data any) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type mockRequest struct {
|
||||
Name string `json:"name,optional"`
|
||||
}
|
||||
|
||||
func (m mockRequest) Validate() error {
|
||||
if m.Name != "hello" {
|
||||
return errors.New("name is not hello")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user