Если вы попытаетесь запросить URL с помощью какого-либо внешнего инструмента, например wget
, вы увидите, что Википедия не обслуживает страницу результатов напрямую. На самом деле он возвращает 302 Moved Temporarily
редирект.
При вводе этого URL в браузере все будет хорошо, так как браузер будет автоматически выполнять перенаправление. simpleHTTP
, однако, не будет. simpleHTTP
, как следует из названия, довольно просто. Он не обрабатывает такие вещи, как куки, SSL или перенаправления.
Вместо этого вы захотите использовать модуль Network.Browser
. Он предлагает гораздо больше контроля над тем, как выполняются запросы. В частности, функция setAllowRedirects
будет автоматически выполнять перенаправления.
Вот быстрая и грязная функция для загрузки URL в String
с поддержкой перенаправлений:
import Network.Browser
grabUrl :: String -> IO String
grabUrl url = fmap (rspBody . snd) . browse $ do
-- Disable logging output
setErrHandler $ const (return ())
setOutHandler $ const (return ())
setAllowRedirects True
request $ getRequest url