1
0
mirror of https://github.com/ggicci/httpin.git synced 2024-11-21 17:16:48 +02:00
🍡 HTTP Input for Go - Decode an HTTP request into a custom struct 📢 the encoding feature will come soon, see branch feat/encoder https://ggicci.github.io/httpin/
Go to file
2024-05-20 18:56:14 -04:00
.github chore(deps): bump actions/setup-go from 4 to 5 2023-12-06 22:54:22 +00:00
core * simplify code 2024-05-18 21:39:39 +01:00
integration fix: move out indirect echo dependency 2024-04-29 20:10:44 -04:00
internal feat: update Decode() api and add DecodeTo() api 2024-04-20 18:18:50 -04:00
patch test: add more tests 2023-10-30 00:50:59 -04:00
.gitignore fix: issue 88, streaming 2024-01-14 13:14:43 -05:00
go.mod feat: update Decode() api and add DecodeTo() api 2024-04-20 18:18:50 -04:00
go.sum fix: move out indirect echo dependency 2024-04-29 20:10:44 -04:00
httpin_test.go feat: update Decode() api and add DecodeTo() api 2024-04-20 18:18:50 -04:00
httpin.go chore: update comments 2024-04-20 19:05:13 -04:00
LICENSE Initial commit 2021-04-13 10:15:37 +08:00
Makefile feat: introduce "coder" directive 2023-12-18 08:10:18 +00:00
README.md chore(docs): tiny update to README 2024-05-20 18:56:14 -04:00

httpin logo

httpin - HTTP Input for Go

HTTP Request from/to Go Struct

Core Features

httpin helps you easily decode data from an HTTP request, including:

  • Query parameters, e.g. ?name=john&is_member=true
  • Headers, e.g. Authorization: xxx
  • Form data, e.g. username=john&password=******
  • JSON/XML Body, e.g. POST {"name":"john"}
  • Path variables, e.g. /users/{username}
  • File uploads

You only need to define a struct to receive/bind data from an HTTP request, without writing any parsing stuff code by yourself.

Since v0.15.0, httpin also supports creating an HTTP request (http.Request) from a Go struct instance.

httpin is:

Add Httpin Directives by Tagging the Struct Fields with in

type ListUsersInput struct {
	Token    string  `in:"query=access_token;header=x-access-token"`
	Page     int     `in:"query=page;default=1"`
	PerPage  int     `in:"query=per_page;default=20"`
	IsMember bool    `in:"query=is_member"`
    Search   *string `in:"query=search;omitempty"`
}

How to decode an HTTP request to Go struct?

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

	if input.IsMember {
		// Do sth.
	}
	// Do sth.
}

How to encode a Go struct to HTTP request?

func SDKListUsers() {
	payload := &ListUsersInput{
		Token:    os.Getenv("MY_APP_ACCESS_TOKEN"),
		Page:     2,
		IsMember: true,
	}

	// Easy to remember, http.NewRequest -> httpin.NewRequest
	req, err := httpin.NewRequest("GET", "/users", payload)
	// ...
}

Why this package?

Compared with using net/http package

func ListUsers(rw http.ResponseWriter, r *http.Request) {
	page, err := strconv.ParseInt(r.FormValue("page"), 10, 64)
	if err != nil {
		// Invalid parameter: page.
		return
	}
	perPage, err := strconv.ParseInt(r.FormValue("per_page"), 10, 64)
	if err != nil {
		// Invalid parameter: per_page.
		return
	}
	isMember, err := strconv.ParseBool(r.FormValue("is_member"))
	if err != nil {
		// Invalid parameter: is_member.
		return
	}

	// Do sth.
}
Benefits Before (use net/http package) After (use ggicci/httpin package)
️ Developer Time 😫 Expensive (too much parsing stuff code) 🚀 Faster (define the struct for receiving input data and leave the parsing job to httpin)
♻️ Code Repetition Rate 😞 High 😍 Lower
📖 Code Readability 😟 Poor 🤩 Highly readable
🔨 Maintainability 😡 Poor 🥰 Highly maintainable

Alternatives and Similars