zhttp
For Zog provides a built in helper package called zhttp
that helps parse JSON, Forms or Query Params. Helps parse a request into a struct by using the Content-Type header to infer the type of the request. Example usage below:
import (
z "github.com/Oudwins/zog"
"github.com/Oudwins/zog/zhttp"
)
var userSchema = z.Struct(z.Schema{
"name": z.String().Required(),
"age": z.Int().Required().GT(18),
})
func handlePostRequest(w http.ResponseWriter, r *http.Request) {
var user := struct {
Name string
Age int
}
// if using json (i.e json Content-Type header):
errs := userSchema.Parse(zhttp.Request(r), &user)
// if using form data (i.e Content-Type header = application/x-www-form-urlencoded)
errs := userSchema.Parse(zhttp.Request(r), &user)
// if using query params (i.e no http Content-Type header)
errs := userSchema.Parse(zhttp.Request(r), &user)
if errs != nil {
}
user.Name // defined
user.Age // defined
}
WARNING The
zhttp
package does NOT currently support parsing into any data type that is NOT a struct.
Behaviour on unmarshal errors
If the json, form or query params are not valid, a top level ZogIssue
will be generated with the IssueCode
IssueCodeInvalidJSON
or IssueCodeZHTTPInvalidForm
or IssueCodeZHTTPInvalidQuery
and the schema will not be run.
Complex Forms
If you need to parse complex forms or query params such as those parsed by packages like qs, for example:
assert.deepEqual(qs.parse("foo[bar]=baz"), {
foo: {
bar: "baz",
},
});
zhttp does not currently support these types of forms (see issue #8). However I suggest you try using the form go package which supports this type of parsing. You can integrate the library with zhttp by overriding the zhttp.Config.Parsers.Form
function.
WARNING: This depends on
DataProviders
which are not yet documented and may change in the future. I encourage you to avoid doing this unless you really need to.