mirror of
https://github.com/ggicci/httpin.git
synced 2024-11-24 08:32:45 +02:00
2.9 KiB
2.9 KiB
httpin
HTTP Input for Go - Decode an HTTP request into a custom struct
Define your input struct and then fetch your data!
Quick View
BEFORE (use net/http) | AFTER (use httpin) |
---|---|
|
|
Features
- Decode from HTTP query, i.e.
http.Request.Form
- Decode from HTTP headers, e.g.
http.Request.Header
- Builtin decoders for basic types, e.g.
bool
,int
,int64
,float32
,time.Time
, ... full list - Decode one field by inspecting multiple keys one by one in the same source
- Decode one field from multiple sources, e.g. both query and headers
- Customize decoders for user defined types
- Define input struct with embedded struct fields
- Tag one field as required
- Builtin encoders for basic types
- Customize encoders for user defined types
Sample User Defined Input Structs
type Authorization struct {
// Decode from multiple sources, the former with higher priority
Token string `in:"form=access_token,header=x-api-token"`
}
type Pagination struct {
Page int `in:"form=page"`
// Decode from multiple keys in the same source, the former with higher priority
PerPage int `in:"form=per_page,page_size"`
}
type ListUsersInput struct {
Gender string `in:"form=gender"`
AgeRange []int `in:"form=age_range"`
IsMember bool `in:"form=is_member"`
Pagination // Embedded field works
Authorization // Embedded field works
}
Advanced - Use Middleware
First, set up the middleware for your handlers. We recommend using alice to chain your HTTP middleware functions.
func init() {
mux.Handle("/users", alice.New(
httpin.NewInput(ListUsersInput{}),
).ThenFunc(ListUsers)).Methods("GET")
}
Second, fetch your input with only one line of code.
func ListUsers(rw http.ResponseWriter, r *http.Request) {
input := r.Context().Value(httpin.Input).(*UserQuery)
// do sth.
}