2016-12-09 3 views
-1

Ich versuche, eine GET-Anfrage an folgende api zu senden:Golang 'http.NewRequest (Methode, URL, Körper)' nicht korrekt formatiert Anfrage erstellen

https://poloniex.com/public?command=returnOrderBook

w/URL-Parameter:

currencyPair = BTC_ETH
depth = 20
-> & currencyPair = BTC_ETH & Tiefe = 20

ich Setup versuchen und meine Anfrage auszuführen, wie so: (beachten Sie, ich Fehler der Kürze halber Überprüfung entfernt haben)

pair := "BTC_ETH" 
depth := 20 
reqURL := "https://poloniex.com/public?command=returnOrderBook" 
values := url.Values { "currencyPair": []string{pair}, "depth": []string{depth}} 
fmt.Printf("\n Values = %s\n", values.Encode())  //DEBUG 
req, err := http.NewRequest("GET", reqURL, strings.NewReader(values.Encode())) 
fmt.Printf("\nREQUEST = %+v\n", req)     //DEBUG 
resp, err := api.client.Do(req) 
defer resp.Body.Close() 
body, err := ioutil.ReadAll(resp.Body) 
fmt.Printf("\nREST CALL RETURNED: %X\n",body)   //DEBUG 

Mein DEBUG print-Anweisungen drucken die folgende:

Values = currencyPair=BTC_ETH&depth=20 

REQUEST = &{Method:GET URL:https://poloniex.com/public?command=returnOrderBook Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[User-Agent:[Poloniex GO API Agent]] Body:{Reader:0xc82028e840} ContentLength:29 TransferEncoding:[] Close:false Host:poloniex.com Form:map[] PostForm:map[] MultipartForm:<nil> Trailer:map[] RemoteAddr: RequestURI: TLS:<nil> Cancel:<nil>} 

REST CALL RETURNED: {"error":"Please specify a currency pair."} 

herum~~POS=TRUNC mit Postman dachte ich, die API nur aus diesen Fehler zurückgibt, wenn der currencyPair Parameter (einschließlich miscapitalized) nicht angegeben ist. Ich kann nicht herausfinden, warum die Anfrage die angegebenen URL-Parameter nicht enthält, da es aus meinen Debug-Print-Anweisungen offensichtlich ist, dass values.Encode() korrekt ist. Die Inhaltslänge in der Anfrage entspricht der richtigen Anzahl an Zeichen (Bytes), die für URL-Parameter benötigt werden.

Jetzt nachdem ich ein bisschen herumgespielt habe, fand ich eine Lösung. Wenn ich ersetzen die http.NewRequest() Linie mit den folgenden es funktioniert:

req, err := http.NewRequest(HTTPType, reqURL + "&" + values.Encode(), nil) 

aber es ist wirklich stört mich, warum die ursprüngliche Aussage nicht funktioniert.

Die neue DEBUG Ausgabe lautet:

Values = currencyPair=BTC_ETH&depth=20 

REQUEST = &{Method:GET URL:https://poloniex.com/public?command=returnOrderBook&currencyPair=BTC_ETH&depth=5 Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[User-Agent:[Poloniex GO API Agent]] Body:<nil> ContentLength:0 TransferEncoding:[] Close:false Host:poloniex.com Form:map[] PostForm:map[] MultipartForm:<nil> Trailer:map[] RemoteAddr: RequestURI: TLS:<nil> Cancel:<nil>} 

REST CALL RETURNED: *way too long, just assume it's the correct financial data* 

Würde eine Eingabe lieben, was ich falsch gemacht habe in der ursprünglichen Aussage. Ich verwendete die gleiche Methode (Original) für einen anderen API-Endpunkt mit URL-Parametern und es hat gut funktioniert. Verwirrt, warum es in diesem Fall nicht funktioniert hat.

Antwort

3

GET-Anfragen sollten keinen Text enthalten. Stattdessen müssen Sie das Formular in die Abfragezeichenfolge einfügen.

Hier ist der richtige Weg, das zu tun, ohne Hacky String-Verkettung:

reqURL := "https://poloniex.com/public" 
values := url.Values { "currencyPair": []string{pair}, "depth": []string{depth}} 
values.Set("command", "returnOrderBook") 
uri, _ := url.Parse(reqURL) 
uri.Query = values.Encode() 
reqURL = uri.String() 
fmt.Println(reqURL) 

req, err := http.NewRequest("GET", reqURL, nil) 
if err != nil { 
    panic(err) // NewRequest only errors on bad methods or un-parsable urls 
} 

https://play.golang.org/p/ZCLUu7UgZL

Verwandte Themen