Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieve optional query variables with gorilla mux?

Tags:

go

gorilla

I'm writing a handler that can take either POST or GET. As such, I want the option of being able to say:

http://host/query?parm1=value&parm2=value

I was assuming that Gorilla mux would then give me:

{
    "parm1": "value",
    "parm2": "value
}

but mux.Vars(r) is empty. I'm aware that using .Query("key", "value" will make the parameters mandatory, which isn't what I want. What am I missing?

like image 214
Scott Deerwester Avatar asked Sep 05 '17 01:09

Scott Deerwester


People also ask

Can query parameters be optional?

As query parameters are not a fixed part of a path, they can be optional and can have default values.

Can post Endpoint have query parameters?

POST should not have query param. You can implement the service to honor the query param, but this is against REST spec.

How does Gorilla mux work?

Package gorilla/mux implements a request router and dispatcher for matching incoming requests to their respective handler. The name mux stands for "HTTP request multiplexer". Like the standard http.

What is mux vars in Golang?

The name mux stands for "HTTP request multiplexer". Like the standard http. ServeMux, mux. Router matches incoming requests against a list of registered routes and calls a handler for the route that matches the URL or other conditions.


1 Answers

As reflected in a comment, the basic answer is "that's not what mux is for". mux is great at picking apart the path portion of a URL, and turning the components into variables. To give a hypothetical example, a call that gives information about a country might have a spec that looks like this:

country/{code}

and accept calls that look like this:

http://myhost/country/DE

You'd get the value of the code parameter like this:

code := mux.Vars(r)["code"]

If you want to pass query variables, you don't do that with mux. Just grab them straight from the request. So given the alternative query syntax:

http://myhost/country?code=DE

you'd do:

code := r.URL.Query().Get("code")
like image 124
Scott Deerwester Avatar answered Sep 20 '22 06:09

Scott Deerwester