允许的内容类型超过:大猩猩中的application / json

Using the excellent Gorilla mux I have special handler for API requests using application/json as content-type:

apiRouter := router.PathPrefix("/api").Headers("Content-Type", "application/json").Subrouter()

However, some users like to provide more than just that string, i.e. application/json; charset=UTF-8. When this header value is set, the handler returns a 404.

What's the best way to handle this by allowing json and any charset specs?

Here's how I did it:

apiRouter := router.PathPrefix("/api").HeadersRegexp("Content-Type", fmt.Sprintf("%s.*", MIMEApplicationJSON)).Subrouter()

Remember, you may apply routing at the actual end point rather than at the root level. For GET requests there would be no need to specify Content-Type, but for POST, you should check for one.

I think this is a good use case for HeadersRegexp.

From the Go Doc:

Regex support also exists for matching Headers within a route. For example, we could do:

r.HeadersRegexp("Content-Type", "application/(text|json)")

...and the route will match both requests with a Content-Type of application/json as well as application/text