我正在尝试使用http-conduit访问 Mt Gox REST API 。仅具有路径的查询(例如https://data.mtgox.com/api/2/BTCUSD/money/ticker)可以正常工作,但是当我向请求中添加 queryString 时,它会超时。
所以这有效:
mtGoxRequest :: String -> QueryText -> Request m
mtGoxRequest p qt = def {
secure = True,
host = "data.mtgox.com",
port = 443,
method = "GET",
path = fromString $ "api/2/" ++ p,
queryString = renderQuery False $ queryTextToQuery qt,
responseTimeout = Just 10000000
}
currencyTicker :: Request m
currencyTicker = mtGoxRequest "BTCUSD/money/ticker" []
但这超时:
tradeStream :: Currency -> UTCTime -> Request m
tradeStream t = mtGoxRequest
"BTCUSD/money/trades/fetch"
[("since", Just $ T.pack $ utcToGoxTime t)]
区别似乎在于查询字符串的使用:当我将虚假查询“foo = bar”添加到也超时的currencyTicker时。
然而,所有这些在 Web 浏览器中都可以正常工作:转到https://data.mtgox.com/api/2/BTCUSD/money/ticker?foo=bar会立即返回正确的错误消息,而不是超时。交易获取 URL 也可以工作,尽管我不会包含链接,因为“since”参数说明了可以追溯到多远。相反,如果我从交易列表请求中删除 queryString,它会正确返回整个可用交易历史。
所以关于 http-conduit 查询字符串的东西显然是不同的。有谁知道它可能是什么?
这是正在发送的 Haskell Request 对象(由“Show”打印):
Request {
host = "data.mtgox.com"
port = 443
secure = True
clientCertificates = []
requestHeaders = []
path = "api/2/BTCUSD/money/trades/fetch"
queryString = "since=1367142721624293"
requestBody = RequestBodyLBS Empty
method = "GET"
proxy = Nothing
rawBody = False
redirectCount = 10
responseTimeout = Just 10000000
}
根据其返回的标头,Mt Gox 正在使用 cloudflare-nginx 和 PHP 5。
编辑:忘了提到,当我使用 http-conduit 向http://scooterlabs.com/echo发送带有 queryString 的请求时,我也得到了正确的响应,所以这似乎是 Mt Gox 网络服务器和http-管道。