In Go's http package, how do I get the query string on a POST request?

GoQuery String

Go Problem Overview


I'm using the httppackage from Go to deal with POST request. How can I access and parse the content of the query string from the Requestobject ? I can't find the answer from the official documentation.

Go Solutions


Solution 1 - Go

A QueryString is, by definition, in the URL. You can access the URL of the request using req.URL (doc). The URL object has a Query() method (doc) that returns a Values type, which is simply a map[string][]string of the QueryString parameters.

If what you're looking for is the POST data as submitted by an HTML form, then this is (usually) a key-value pair in the request body. You're correct in your answer that you can call ParseForm() and then use req.Form field to get the map of key-value pairs, but you can also call FormValue(key) to get the value of a specific key. This calls ParseForm() if required, and gets values regardless of how they were sent (i.e. in query string or in the request body).

Solution 2 - Go

Here's a more concrete example of how to access GET parameters. The Request object has a method that parses them out for you called Query:

Assuming a request URL like http://host:port/something?param1=b

func newHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Println("GET params were:", r.URL.Query())
 
  // if only one expected
  param1 := r.URL.Query().Get("param1")
  if param1 != "" {
    // ... process it, will be the first (only) if multiple were given
    // note: if they pass in like ?param1=&param2= param1 will also be "" :|
  }

  // if multiples possible, or to process empty values like param1 in
  // ?param1=&param2=something
  param1s := r.URL.Query()["param1"]
  if len(param1s) > 0 {
    // ... process them ... or you could just iterate over them without a check
    // this way you can also tell if they passed in the parameter as the empty string
    // it will be an element of the array that is the empty string
  }    
}

Also note "the keys in a Values map [i.e. Query() return value] are case-sensitive."

Solution 3 - Go

Below is an example:

value := r.FormValue("field")

for more info. about http package, you could visit its documentation here. FormValue basically returns POST or PUT values, or GET values, in that order, the first one that it finds.

Solution 4 - Go

There are two ways of getting query params:

  1. Using reqeust.URL.Query()
  2. Using request.Form

In second case one has to be careful as body parameters will take precedence over query parameters. A full description about getting query params can be found here

https://golangbyexample.com/net-http-package-get-query-params-golang

Solution 5 - Go

Here's a simple, working example:

package main

import (
	"io"
	"net/http"
)
func queryParamDisplayHandler(res http.ResponseWriter, req *http.Request) {
	io.WriteString(res, "name: "+req.FormValue("name"))
	io.WriteString(res, "\nphone: "+req.FormValue("phone"))
}

func main() {
	http.HandleFunc("/example", func(res http.ResponseWriter, req *http.Request) {
		queryParamDisplayHandler(res, req)
	})
	println("Enter this in your browser:  http://localhost:8080/example?name=jenny&phone=867-5309")
	http.ListenAndServe(":8080", nil)
}

enter image description here

Solution 6 - Go

Below words come from the official document.

> Form contains the parsed form data, including both the URL field's query parameters and the POST or PUT form data. This field is only available after ParseForm is called.

So, sample codes as below would work.

func parseRequest(req *http.Request) error {
	var err error

	if err = req.ParseForm(); err != nil {
		log.Error("Error parsing form: %s", err)
		return err
	}
	
	_ = req.Form.Get("xxx")

	return nil
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFabienView Question on Stackoverflow
Solution 1 - GomnaView Answer on Stackoverflow
Solution 2 - GorogerdpackView Answer on Stackoverflow
Solution 3 - GoMuhammad SolimanView Answer on Stackoverflow
Solution 4 - Gouser27111987View Answer on Stackoverflow
Solution 5 - Gol3xView Answer on Stackoverflow
Solution 6 - GoChrisLeeView Answer on Stackoverflow