Documentation
¶
Overview ¶
Example ¶
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"strings"
"time"
"github.com/henrylee2cn/goutil/httpbody"
"github.com/ssdev-go/go-tagexpr/v2/binding"
)
func main() {
type InfoRequest struct {
Name string `path:"name"`
Year []int `query:"year"`
Email *string `json:"email" vd:"email($)"`
Friendly bool `json:"friendly"`
Pie float32 `json:"pie,required"`
Hobby []string `json:",required"`
BodyNotFound *int `json:"BodyNotFound"`
Authorization string `header:"Authorization,required" vd:"$=='Basic 123456'"`
userIdHeader string `header:"x-user_ID,required"`
SessionID string `cookie:"sessionid,required"`
AutoBody string
AutoNotFound *string
TimeRFC3339 time.Time `query:"t"`
}
args := new(InfoRequest)
binder := binding.New(nil)
err := binder.BindAndValidate(args, requestExample(), new(testPathParams))
fmt.Println("bind and validate result:")
fmt.Printf("error: %v\n", err)
b, _ := json.MarshalIndent(args, "", " ")
fmt.Printf("args JSON string:\n%s\n", b)
}
func requestExample() *http.Request {
contentType, bodyReader, _ := httpbody.NewJSONBody(map[string]interface{}{
"email": "[email protected]",
"friendly": true,
"pie": 3.1415926,
"Hobby": []string{"Coding", "Mountain climbing"},
"AutoBody": "autobody_test",
})
header := make(http.Header)
header.Add("Content-Type", contentType)
header.Add("Authorization", "Basic 123456")
header.Add("x-user_ID", "123456")
cookies := []*http.Cookie{
{Name: "sessionid", Value: "987654"},
}
req := newRequest("http://localhost/info/henrylee2cn?year=2018&year=2019&t=2019-09-04T18%3A04%3A08%2B08%3A00", header, cookies, bodyReader)
req.Method = "POST"
var w bytes.Buffer
req.Write(&w)
fmt.Printf("request:\n%s", strings.Replace(w.String(), "\r\n", "\n", -1))
bodyReader.(*bytes.Reader).Seek(0, 0)
return req
}
Output: request: POST /info/henrylee2cn?year=2018&year=2019&t=2019-09-04T18%3A04%3A08%2B08%3A00 HTTP/1.1 Host: localhost User-Agent: Go-http-client/1.1 Transfer-Encoding: chunked Authorization: Basic 123456 Content-Type: application/json;charset=utf-8 Cookie: sessionid=987654 X-User_id: 123456 83 {"AutoBody":"autobody_test","Hobby":["Coding","Mountain climbing"],"email":"[email protected]","friendly":true,"pie":3.1415926} 0 bind and validate result: error: <nil> args JSON string: { "Name": "henrylee2cn", "Year": [ 2018, 2019 ], "email": "[email protected]", "friendly": true, "pie": 3.1415925, "Hobby": [ "Coding", "Mountain climbing" ], "BodyNotFound": null, "Authorization": "Basic 123456", "SessionID": "987654", "AutoBody": "autobody_test", "AutoNotFound": null, "TimeRFC3339": "2019-09-04T18:04:08+08:00" }
Index ¶
- func Bind(structPointer interface{}, req *http.Request, pathParams PathParams) error
- func BindAndValidate(structPointer interface{}, req *http.Request, pathParams PathParams) error
- func MustRegTypeUnmarshal(t reflect.Type, fn func(v string, emptyAsZero bool) (reflect.Value, error))
- func RegTypeUnmarshal(t reflect.Type, fn func(v string, emptyAsZero bool) (reflect.Value, error)) error
- func ResetJSONUnmarshaler(fn JSONUnmarshaler)
- func SetErrorFactory(bindErrFactory, validatingErrFactory func(failField, msg string) error)
- func SetLooseZeroMode(enable bool)
- func Validate(value interface{}) error
- type Binding
- func (b *Binding) Bind(recvPointer interface{}, req *http.Request, pathParams PathParams) error
- func (b *Binding) BindAndValidate(recvPointer interface{}, req *http.Request, pathParams PathParams) error
- func (b *Binding) IBind(recvPointer interface{}, req Request, pathParams PathParams) error
- func (b *Binding) IBindAndValidate(recvPointer interface{}, req Request, pathParams PathParams) error
- func (b *Binding) SetErrorFactory(bindErrFactory, validatingErrFactory func(failField, msg string) error) *Binding
- func (b *Binding) SetLooseZeroMode(enable bool) *Binding
- func (b *Binding) Validate(value interface{}) error
- type Body
- type Config
- type Error
- type JSONUnmarshaler
- type PathParams
- type Request
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Bind ¶
func Bind(structPointer interface{}, req *http.Request, pathParams PathParams) error
Bind binds the request parameters.
func BindAndValidate ¶
func BindAndValidate(structPointer interface{}, req *http.Request, pathParams PathParams) error
BindAndValidate binds the request parameters and validates them if needed.
func MustRegTypeUnmarshal ¶
func MustRegTypeUnmarshal(t reflect.Type, fn func(v string, emptyAsZero bool) (reflect.Value, error))
MustRegTypeUnmarshal registers unmarshalor function of type. NOTE:
panic if exist error.
func RegTypeUnmarshal ¶
func RegTypeUnmarshal(t reflect.Type, fn func(v string, emptyAsZero bool) (reflect.Value, error)) error
RegTypeUnmarshal registers unmarshalor function of type.
func ResetJSONUnmarshaler ¶
func ResetJSONUnmarshaler(fn JSONUnmarshaler)
ResetJSONUnmarshaler reset the JSON Unmarshal function. NOTE: verifyingRequired is true if the required tag is supported.
func SetErrorFactory ¶
SetErrorFactory customizes the factory of validation error. NOTE:
If errFactory==nil, the default is used
func SetLooseZeroMode ¶
func SetLooseZeroMode(enable bool)
SetLooseZeroMode if set to true, the empty string request parameter is bound to the zero value of parameter. NOTE:
The default is false; Suitable for these parameter types: query/header/cookie/form .
Types ¶
type Binding ¶
type Binding struct {
// contains filtered or unexported fields
}
Binding binding and verification tool for http request
func Default ¶
func Default() *Binding
Default returns the default binding. NOTE:
path tag name is 'path'; query tag name is 'query'; header tag name is 'header'; cookie tag name is 'cookie'; raw_body tag name is 'raw_body'; form tag name is 'form'; validator tag name is 'vd'; protobuf tag name is 'protobuf'; json tag name is 'json'; LooseZeroMode is false.
func (*Binding) Bind ¶
func (b *Binding) Bind(recvPointer interface{}, req *http.Request, pathParams PathParams) error
Bind binds the request parameters.
func (*Binding) BindAndValidate ¶
func (b *Binding) BindAndValidate(recvPointer interface{}, req *http.Request, pathParams PathParams) error
BindAndValidate binds the request parameters and validates them if needed.
func (*Binding) IBind ¶
func (b *Binding) IBind(recvPointer interface{}, req Request, pathParams PathParams) error
IBind binds the request parameters.
func (*Binding) IBindAndValidate ¶
func (b *Binding) IBindAndValidate(recvPointer interface{}, req Request, pathParams PathParams) error
IBindAndValidate binds the request parameters and validates them if needed.
func (*Binding) SetErrorFactory ¶
func (b *Binding) SetErrorFactory(bindErrFactory, validatingErrFactory func(failField, msg string) error) *Binding
SetErrorFactory customizes the factory of validation error. NOTE:
If errFactory==nil, the default is used
func (*Binding) SetLooseZeroMode ¶
SetLooseZeroMode if set to true, the empty string request parameter is bound to the zero value of parameter. NOTE:
The default is false; Suitable for these parameter types: query/header/cookie/form .
type Config ¶
type Config struct {
// LooseZeroMode if set to true,
// the empty string request parameter is bound to the zero value of parameter.
// NOTE: Suitable for these parameter types: query/header/cookie/form .
LooseZeroMode bool
// PathParam use 'path' by default when empty
PathParam string
// Query use 'query' by default when empty
Query string
// Header use 'header' by default when empty
Header string
// Cookie use 'cookie' by default when empty
Cookie string
// RawBody use 'raw' by default when empty
RawBody string
// FormBody use 'form' by default when empty
FormBody string
// Validator use 'vd' by default when empty
Validator string
// contains filtered or unexported fields
}
Config the struct tag naming and so on
type JSONUnmarshaler ¶
JSONUnmarshaler is the interface implemented by types that can unmarshal a JSON description of themselves.
type PathParams ¶
type PathParams interface {
// Get returns the value of the first parameter which key matches the given name.
// If no matching parameter is found, an empty string is returned.
Get(name string) (string, bool)
}
PathParams parameter acquisition interface on the URL path