首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过http-导管处理404

通过http-导管处理404
EN

Stack Overflow用户
提问于 2014-07-30 22:11:10
回答 1查看 274关注 0票数 1

使用http-conduit,我想下载实现以下语义的HTTP (结果是IO (Maybe LB.ByteString) ):

  1. 如果HTTP代码为2xx,则返回Just响应体
  2. 如果HTTP响应代码为404,则返回Nothing
  3. 如果响应代码指示重定向,请按照标准的http-导管设置执行。
  4. 对于任何其他响应代码,抛出一个StatusCodeException

如果没有httpLbs及其依赖项之外的任何库,我如何使用http-conduit

注意:这个问题是用问答的形式回答的,因此故意没有表现出研究的努力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-30 22:11:10

这可以通过使用类似于checkStatus之一的自定义官方例子来实现。

如果响应状态代码为2xx或404,我们将声明checkStatus200。如果不传递,则调用默认的checkStatus函数来抛出适当的异常。

在使用httpLbs使用Request调用checkStatus200之后,我们可以检查状态代码并返回Just响应代码或Nothing

代码语言:javascript
复制
import Data.Conduit.Binary (sinkFile)
import Network.HTTP.Types.Status (Status(..))
import Network.HTTP.Conduit
import qualified Data.Conduit as C
import Network
import Data.Default (def)
import qualified Data.ByteString.Lazy as LB

-- | @checkStatus@ implementation that accepts 
--   2xx status codes and 404. Calls default implementation
--   on other status codes (i.e. throws exception)
checkStatus200 st@(Status sc _) rh cj =
    if (200 <= sc && sc < 300) || sc == 404
        then Nothing
        else (checkStatus def) st rh cj

-- | Download a HTTP link, returning @Nothing@ on 404 status code
downloadCatch404 :: String
                 -> IO (Maybe LB.ByteString)
downloadCatch404 url = withSocketsDo $ do
    request <- parseUrl url
    let request' = request { checkStatus = checkStatus200 }
    res <- withManager $ httpLbs request'
    let status =  statusCode . responseStatus $ res
    -- Return Nothing if status code == 404
    return $ if status == 404
        then Nothing
        else Just $ responseBody res
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25047844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档