2

我正在尝试使用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-管道。

4

2 回答 2

1

想通了。您需要添加一个用户代理字符串。所以

requestHeaders = [(CI.mk "User-Agent", "Test/0.0.1")],

在请求函数的中间使它工作。

于 2013-04-28T20:46:41.627 回答
0
$ time curl https://data.mtgox.com/api/2/BTCUSD/money/trades/fetch?since=1367142721624293
...
real    0m20.993s

在我看来一切正常:API 调用需要一段时间才能返回,因此 http-conduit 会引发超时异常,因为 20 秒比 10 秒长。

于 2013-04-28T15:26:12.753 回答