Golang : Handle API query by curl with Gorilla Queries example
This is an add on for previous tutorial on how to use Gorilla mux example. One reader emailed and asked me on how to use Gorilla mux to handle curl query or URL that look like this :
http://website.com:8080/api/getDataAPI/v1?name=Boo&job=CEO&age=50
rather than :
http://website.com:8080/person/Boo/CEO/50
Gorilla webtoolkit has the Queries
method that you can use to configure your handler to accept input with &
. This can be useful in building REST API.
Below is an example for you to compare the way how ProcessPathVariables()
versus HandleAPI()
functions work. HandleAPI() function uses the Queries() method to break down the variables from the given URL.
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
)
func Home(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("use curl command!"))
}
func ProcessPathVariables(w http.ResponseWriter, r *http.Request) {
// break down the variables for easier assignment
vars := mux.Vars(r)
name := vars["name"]
job := vars["job"]
age := vars["age"]
w.Write([]byte(fmt.Sprintf("Name is %s ", name)))
w.Write([]byte(fmt.Sprintf("Job is %s ", job)))
w.Write([]byte(fmt.Sprintf("Age is %s ", age)))
}
func HandleAPI(w http.ResponseWriter, r *http.Request) {
// Queries will automatically break down the &variables
// you don't need to worry about the ampersand & in the
// URL.
vars := mux.Vars(r)
version := vars["version"]
name := vars["name"]
job := vars["job"]
age := vars["age"]
w.Write([]byte(fmt.Sprintf("Version is %s\n", version)))
w.Write([]byte(fmt.Sprintf("Name is %s \n", name)))
w.Write([]byte(fmt.Sprintf("Job is %s \n", job)))
w.Write([]byte(fmt.Sprintf("Age is %s \n", age)))
}
func main() {
mx := mux.NewRouter()
mx.HandleFunc("/", Home)
//to handle URL like
//http://website:8080/person/Boo/CEO/199
//http://website:8080/person/Boo/CEO/199 <- if age > 199, will cause 404 error
mx.HandleFunc("/person/{name}/{job}/{age:[0-199]+}", ProcessPathVariables)
//to handle URL like
//http://website:8080/api/getDataAPI/v1?name=Boo&job=CEO&age=50
mx.HandleFunc("/api/getDataAPI/{version}", HandleAPI).Queries("name", "{name}", "job", "{job}", "age", "{age:[0-999]+}")
http.ListenAndServe(":8080", mx)
}
Do test out this code with curl and see how it goes.
A sample output :
http://example.com:8080/api/getDataAPI/v1?name=Boo&job=CEO&age=999
Version is v1
Name is Boo
Job is CEO
Age is 999
Reference :
See also : Golang : Gorilla mux routing example
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+10.7k Golang : Generate random elements without repetition or duplicate
+10.3k Golang : Get local time and equivalent time in different time zone
+5.2k Golang : Get S3 or CloudFront object or file information
+14.9k Golang : How to get Unix file descriptor for console and file
+12.7k Golang : Convert(cast) uintptr to string example
+5.7k nginx : force all pages to be SSL
+13.9k Golang : Check if a file exist or not
+11.4k Golang : Calculations using complex numbers example
+5.5k Fix yum-complete-transaction error
+21.7k Fix "Failed to start php5-fpm.service: Unit php5-fpm.service is masked."
+10.9k CodeIgniter : How to check if a session exist in PHP?
+40.7k Golang : How to count duplicate items in slice/array?