我尝试向以下api发送GET请求:
w / URL参数:
currencyPair = BTC_ETH
深度= 20
- > &安培; currencyPair = BTC_ETH&安培;深度= 20
我尝试设置并执行我的请求:(注意我已经删除了错误检查以简化)
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
我的DEBUG打印语句打印出以下内容:
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."}
使用Postman我发现API只在未指定currencyPair参数时返回此错误(包括miscapitalized)。我无法弄清楚为什么请求不包含我指定的URL参数,因为从我的调试打印语句中可以明显看出values.Encode()是正确的。请求中的内容长度对应于URL参数所需的正确数量的字符(字节)。
现在玩了一下之后我找到了一个解决方案。 如果我用以下代码替换http.NewRequest()行,它可以工作:
req, err := http.NewRequest(HTTPType, reqURL + "&" + values.Encode(), nil)
但是,为什么原始声明不起作用真的让我感到烦恼。
新的DEBUG输出是:
Values = currencyPair=BTC_ETH&depth=20
REQUEST = &{Method:GET URL:https://poloniex.com/public?command=returnOrderBook¤cyPair=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*
我会喜欢在原始陈述中对错误所做的事情。我使用相同的方法(原始)用于不同的api端点w / URL参数,它工作正常。对于为什么它在这种情况下不起作用感到困惑。
答案 0 :(得分:3)
GET请求不应包含正文。相反,您需要将表单放入查询字符串。
这是正确的方法,没有hacky字符串连接:
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
}