我正在學習Plutus Pioneer Lectures的第一次迭代,第6講從coinmarketcap.com獲取匯率的代碼回傳403錯誤:
getExchangeRate = runReq defaultHttpConfig $ do
v <- req
GET[/span
(https "coinmarketcap.com" /: "currency" /: "cardano")
NoReqBody[/span]。
bsResponse
記憶
let priceRegex = "priceValue___11gHJ">$([.0-9]*)"/span> :: ByteString
(_, _, _, [bs]) = responseBody v =~ priceRegex :: (ByteString, ByteString, ByteString, [ByteString] )
d = read $ unpack bs :: Double[/span]]。
x = round $ 1_000_000 * d
liftIO $ putStrLn $ "查詢的匯率。" 顯示 d
回傳 x
如果我在curl中使用-L選項嘗試相同的url,以跟蹤重定向,它可以作業:
curl -i -L 'https://coinmarketcap.com/currencies/cardano'
我看到的唯一區別是,Haskell代碼的請求是HTTP/1.1,但curl請求的發送是HTTP/2
我想改變Haskell庫所發送的HTTP版本,以檢查這是否是問題所在。然而,我是一個相對陌生的 Haskell 新手,所以我還沒有弄清楚是否有辦法通過 Haskell Network.HTTP.Req 模塊來設定 HTTP 版本。
是否有辦法做到這一點?
TIA
uj5u.com熱心網友回復:
我相信coinmarketcap.com正在阻止那些沒有指定User-Agent頭的請求。你可以這樣做:
getExchangeRate = runReq defaultHttpConfig $ do
v <- req
GET[/span
(https "coinmarketcap.com" /: "currency" /: "cardano")
NoReqBody[/span]。
bsResponse
(header "User-Agent" "my-app/0.1.0.0")
let priceRegex = "priceValue___11gHJ">$([.0-9]*)"/span> :: ByteString
(_, _, _, [bs]) = responseBody v =~ priceRegex :: (ByteString, ByteString, ByteString, [ByteString] )
d = read $ unpack bs :: Double[/span]]。
x = round $ 1_000_000 * d
liftIO $ putStrLn $ "查詢的匯率。" 顯示 d
回傳 x
使用這段代碼,請求正確完成,但我遇到了一個模式匹配錯誤。似乎priceValue___11gHJ重碼不再起作用了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316915.html
標籤:
上一篇:在Haskell中實作序數
