2

http-conduitを使用して Mt Gox REST API にアクセスしようとしています。パスだけを持つクエリ (例: https://data.mtgox.com/api/2/BTCUSD/money/ticker ) は正常に動作しますが、クエリ文字列をリクエストに追加するとタイムアウトになります。

したがって、これは機能します:

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)]

違いは queryString の使用にあるようです: 偽のクエリ "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 を使用して queryString を含むリクエストをhttp://scooterlabs.com/echoに送信すると、正しい応答も返されるので、Mt Gox Web サーバーとhttp コンジット。

4

2 に答える 2

0
$ time curl https://data.mtgox.com/api/2/BTCUSD/money/trades/fetch?since=1367142721624293
...
real    0m20.993s

すべてが正しく機能しているように見えます。API 呼び出しが戻るまでに時間がかかるため、20 秒は 10 秒よりも長いため、http-conduit はタイムアウト例外をスローします。

于 2013-04-28T15:26:12.753 に答える