Как установить версию HTTP с помощью запроса Haskell
Я прорабатываю первую итерацию лекций Plutus Pioneer Lectures, и код лекции 6, который получает обменный курс от coinmarketcap.com, возвращает ошибку 403:
getExchangeRate = runReq defaultHttpConfig $ do
v <- req
GET
(https "coinmarketcap.com" /: "currencies" /: "cardano")
NoReqBody
bsResponse
mempty
let priceRegex = "priceValue___11gHJ\">\\$([\\.0-9]*)" :: ByteString
(_, _, _, [bs]) = responseBody v =~ priceRegex :: (ByteString, ByteString, ByteString, [ByteString])
d = read $ unpack bs :: Double
x = round $ 1_000_000 * d
liftIO $ putStrLn $ "queried exchange rate: " ++ show d
return x
если я попробую тот же URL-адрес в curl с параметром -L, чтобы следовать перенаправлениям, он сработает:
curl -i -L 'https://coinmarketcap.com/currencies/cardano'
Единственное различие, которое я вижу, заключается в том, что запрос кода Haskell
HTTP/1.1
, но запрос curl отправляется с
HTTP/2
Я хотел бы изменить версию HTTP, которую отправляет библиотека Haskell, чтобы проверить, не в этом ли проблема. Однако я относительно новичок в Haskell, поэтому мне не удалось выяснить, есть ли способ с помощью модуля Haskell Network.HTTP.Req установить версию HTTP.
Есть ли способ сделать это?
TIA
1 ответ
Я считаю, что coinmarketcap.com блокирует запросы, у которых нет
User-Agent
указан заголовок. Сделать это можно так:
getExchangeRate = runReq defaultHttpConfig $ do
v <- req
GET
(https "coinmarketcap.com" /: "currencies" /: "cardano")
NoReqBody
bsResponse
(header "User-Agent" "my-app/0.1.0.0")
let priceRegex = "priceValue___11gHJ\">\\$([\\.0-9]*)" :: ByteString
(_, _, _, [bs]) = responseBody v =~ priceRegex :: (ByteString, ByteString, ByteString, [ByteString])
d = read $ unpack bs :: Double
x = round $ 1_000_000 * d
liftIO $ putStrLn $ "queried exchange rate: " ++ show d
return x
С этим кодом запрос завершается правильно, но я сталкиваюсь с ошибкой сопоставления с шаблоном. Кажется,
priceValue___11gHJ
регулярное выражение больше не работает.