2017-10-04 1 views
0
A := 123 
B := "xyz" 
b := bytes.NewBufferString("a=" + A + "&b=" + B) 
r.Body = ioutil.NopCloser(b) 

Gibt es eine bessere Art und Weise Variablen der Einstellung a und b vor der POST Anfrage gesendet wird?Rahmen POST Anfrage Datenvariablen

+0

Was meinst du mit besser? – noel

+0

@Shakabra, um die Manipulation von Strings zu vermeiden – exebook

+0

Sie manipulieren keine Strings, Sie haben nur ein String-Literal. Du meinst, ohne Werte in der verschlüsselten Form angeben zu müssen? – icza

Antwort

3

Bestimmte Zeichen in Formschlüsseln und Werten müssen maskiert werden, z. B. & oder =. Um diese Fehler zu vermeiden, verwenden Sie am besten den Typ url.Values.

Es Karten string Schlüssel zur Liste der string Werte. Wenn Sie also einen anderen Wert als string haben, müssen Sie zuerst in string konvertieren. Am einfachsten ist es, fmt.Sprint() oder strconv.Itoa() zu verwenden (für weitere Optionen siehe Golang: format a string without printing?).

vs := url.Values{} 
vs.Set("a", fmt.Sprint(123)) 
vs.Set("b", "xyz") 
vs.Set("tricky", "= & =") 
b := bytes.NewBufferString(vs.Encode()) 

url.Values weiß, wie man richtig Schlüssel und Werte zu entkommen. Die obige vs.Encode() zum Beispiel Ausgänge (versuchen Sie es auf dem Go Playground):

a=123&b=xyz&tricky=%3D+%26+%3D 

Hinweis:

Wie url.Values ist nur eine Karte (mit map[string][]string als zugrunde liegende Typ), können Sie auch eine einfache verwenden composite literal zu erstellen und füllen:

vs := url.Values{ 
    "a":  {strconv.Itoa(123)}, 
    "b":  {"xyz"}, 
    "tricky": {"= & ="}, 
} 
b := bytes.NewBufferString(vs.Encode()) 

diese Variante Versuchen sie, auf die Go Playground.