go get github.com/canpacis/http-payloadScanner is a utility package to extract certain values and cast them to usable values in the context of http servers. It can extract request bodies, form values, url queries, cookies and headers. Scanner defines a Scanner interface for you to extend it to your own needs.
type Scanner interface {
Scan(any) error
}An example that extracts header values from an http.Header object.
type Params struct {
// provide the header name in the field tag
Language string `header:"accept-language"`
}
// ...
// Create your instance
p := &Params{}
// Provide the request headers
s := payload.NewHeaderScanner(r.Headers())
if err := s.Scan(p); err != nil {
// handle error
}
// p.Language -> r.Headers().Get("Accept-Language")You can compose your scanners. There are a handful of pre-built scanners for the most common of use cases.
payload.JSONScanner: Scans json data from anio.Readerpayload.HeaderScanner: Scans header data from an*http.Headerpayload.QueryScanner: Scans url query values from a*url.Valuespayload.FormScanner: Scans form data from a*url.Valuespayload.CookieScanner: Scans cookies from ahttp.CookieJarpayload.MultipartScanner: Scans multipart form data from apayload.MultipartValuespayload.ImageScanner: Scans multipart images from apayload.MultipartValues
eg.:
type Params struct {
IDs []string `query:"ids"`
Language string `header:"accept-language"`
Token string `cookie:"token"`
}
// ...
// Create your instance
p := &Params{}
var s payload.Scanner
s = payload.NewQueryScanner(/* url.Values */)
s.Scan(p) // Don't forget to handle errors
s = payload.NewHeaderScanner(/* http.Header */)
s.Scan(p) // Don't forget to handle errors
s = payload.NewCookieScanner(/* http.CookieJar */)
s.Scan(p) // Don't forget to handle errorsOr, alternatively, you can use a payload.PipeScanner to streamline the process.
type Params struct {
IDs []string `query:"ids"`
Language string `header:"accept-language"`
Token string `cookie:"token"`
}
// ...
// Create your instance
p := &Params{}
s := payload.NewPipeScanner(
payload.NewQueryScanner(/* url.Values */),
payload.NewHeaderScanner(/* http.Header */),
payload.NewCookieScanner(/* http.CookieJar */),
)
s.Scan(p) // Don't forget to handle errorsThis will populate your struct's fields with available values.