web-dev-qa-db-fra.com

Comment ajouter des paramètres de requête URL à une requête HTTP GET?

J'essaie d'ajouter un paramètre de requête à une requête HTTP GET mais les méthodes indiquées sur SO (par exemple ici ) ne fonctionnent pas).

J'ai le morceau de code suivant:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    req, err := http.NewRequest("GET", "/callback", nil)
    req.URL.Query().Add("code", "0xdead 0xbeef")
    req.URL.Query().Set("code", "0xdead 0xbeef")
    // this doesn't help
    //req.URL.RawQuery = req.URL.Query().Encode()

    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("URL      %+v\n", req.URL)
    fmt.Printf("RawQuery %+v\n", req.URL.RawQuery)
    fmt.Printf("Query    %+v\n", req.URL.Query())
}

qui imprime:

URL      /callback
RawQuery 
Query    map[]

Des suggestions sur la façon d'y parvenir?

Exemple de terrain de jeu: https://play.golang.org/p/SYN4yNbCmo

7
Patryk

Vérifiez les documents pour req.URL.Query() :

Query analyse RawQuery et renvoie les valeurs correspondantes.

Puisqu'il "analyse RawQuery et renvoie" les valeurs que vous obtenez n'est qu'une copie des valeurs de la requête URL, pas une "référence en direct", donc la modification de cette copie n'a aucun effet sur la requête d'origine. Afin de modifier la requête d'origine, vous devez affecter au RawQuery d'origine.

q := req.URL.Query() // Get a copy of the query values.
q.Add("code", "0xdead 0xbeef") // Add a new value to the set.
req.URL.RawQuery = q.Encode() // Encode and assign back to the original query.

// URL      /callback?code=0xdead+0xbeef
// RawQuery code=0xdead+0xbeef
// Query    map[code:[0xdead 0xbeef]]

Notez que votre tentative initiale de le faire n'a pas fonctionné car elle analyse simplement les valeurs de la requête, les encode et les attribue directement à l'URL:

req.URL.RawQuery = req.URL.Query().Encode()
// This is basically a noop!
19
maerics