gpt4 book ai didi

haskell - 如何使用 http-enumerator 处理异常

转载 作者:行者123 更新时间:2023-12-02 14:56:09 26 4
gpt4 key购买 nike

这里是 Haskell 新手。我正在尝试使用 http-enumerator 通过 XML over HTTP 查询服务。我能够连接并发送 xml 格式的请求,并接收 xml 格式的响应。

当查询成功时,服务器会发回一个以

我正在努力解决的是处理 FAULT 文档中指示的异常的正确方法。我正在尝试使用Either,但没有成功。

我在 ghci 中编译的内容如下:

import Network.HTTP.Enumerator 
import Network.HTTP.Types

import qualified Data.ByteString.Lazy as L
import Data.ByteString.UTF8

import Text.XML.Light

hostname = "https://server..."

doPost username password token = do

let q = QName "SYSTEM" Nothing Nothing

let attribs = [Attr {attrKey = QName "user" Nothing Nothing, attrVal = username},
Attr {attrKey = QName "password" Nothing Nothing, attrVal = password},
Attr {attrKey = QName "token" Nothing Nothing, attrVal = token}]

let doc = Element {elName=q, elAttribs=attribs, elContent= [], elLine=Nothing}

req0 <- parseUrl hostname

let req = req0 { method = methodPost
, requestHeaders = [("Content-Type", "text/xml")]
, requestBody = RequestBodyBS $ fromString $ showTopElement doc
}

res <- withManager $ httpLbs req

let status = Network.HTTP.Enumerator.statusCode res
let content = responseBody res

-- this is where I would check for different fault codes using a case statement
if content == "<FAULT/>"
then Left "error"
else Right content

但是,当我尝试在 ghci 中运行它时,我得到以下信息:

*Main> doPost "user" "password" ""

<interactive>:1:1:
No instances for (Control.Failure.Failure
HttpException (Either a0),
Control.Monad.IO.Control.MonadControlIO (Either a0))
arising from a use of `doPost'
Possible fix:
add instance declarations for
(Control.Failure.Failure HttpException (Either a0),
Control.Monad.IO.Control.MonadControlIO (Either a0))
In the expression: doPost "user" "password" ""
In an equation for `it': it = doPost "user" "password" ""

在这种情况下处理异常的最佳方法是什么?

提前致谢。尼尔

最佳答案

您需要在最后一个 if 之前添加“return $”。 parseUrl 需要在 monad 中运行,该 monad 是 Failure HttpException 的实例,例如 IO 或 Maybe。 withManager 需要一个 monad,它是 MonadControlIO 的实例,例如 IO

目前,最后的 if 会强制整个 do block 在 Either String monad 中运行,这就是为什么您遇到“无实例”异常。如果添加返回,最终结果将类似于 IO (Either String XML)

关于haskell - 如何使用 http-enumerator 处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7409788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com