Skip to main content


go-chi/chi is

a lightweight, idiomatic and composable router for building Go HTTP services.

Chain httpin.NewInput middleware with chi.With method

type Pagination struct {
Page int `in:"query=page"`
PerPage int `in:"query=per_page,page_size"`

type ListUsersInput struct {
Gender string `in:"query=gender"`
AgeRange []int `in:"query=age_range"`
IsMember bool `in:"query=is_member"`

func ListUsers(rw http.ResponseWriter, r *http.Request) {
input := r.Context().Value(httpin.Input).(*ListUsersInput)

func main() {
router := chi.NewRouter()
// use `With` method to chain the middleware created by `httpin.NewInput`
router.With(httpin.NewInput(ListUsersInput{})).Get("/users", ListUsers)

path Directive by URLParam Method

func init() {
// Register a directive named "path" to retrieve values from `chi.URLParam`,
// i.e. decode path variables.
httpin.UseGochiURLParam("path", chi.URLParam)

type GetArticleOfUserInput struct {
Author string `in:"path=author"` // equivalent to chi.URLParam("author")
ArticleID int64 `in:"path=article_id"`

func GetArticleOfUser(rw http.ResponseWriter, r *http.Request) {
var input = r.Context().Value(Input).(*GetArticleOfUserInput)
// ...

func main() {
r := chi.NewRouter()
).Get("/{author}/p/{article_id}", GetArticleOfUser)
// ...