我正在尝试使用this question中的代码提取基本帖子请求(除了我使用lbsBackEnd
而不是不再存在的lbsSink
)。
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai.Handler.Warp (run)
import qualified Data.ByteString.Char8 as C
import Network.Wai.Parse (parseRequestBody, lbsBackEnd)
import Network.Wai(Response(..))
import Network.HTTP.Types(status200)
import Blaze.ByteString.Builder
main = run 3000 app
app req = do
(params, _) <- parseRequestBody lbsBackEnd req
let r = C.concat $ map (\(x,y) -> C.concat [x,y]) params
return $ ResponseBuilder
status200
[("Content-Type", "text/plain")]
$ fromByteString r
该问题中的评论表明这应该有效,但我收到类型错误
Couldn't match expected type `C.ByteString'
with actual type `bytestring-0.9.2.1:Data.ByteString.Internal.ByteString'
Expected type: [(C.ByteString, C.ByteString)]
Actual type: [Network.Wai.Parse.Param]
In the second argument of `map', namely `params'
In the second argument of `($)', namely
这有点奇怪,因为Network.Wai.Parse文档说Param
是(ByteString, ByteString)
的类型同义词,所以据我所知,这个应该工作
关于我做错的任何提示?
答案 0 :(得分:2)
您的wai-extra是使用bytestring-0.9.2.1
构建的,但您安装了较新的bytestring
软件包。除非GHC被指示使用带有-package
标志的旧版本或隐藏较新版本,否则它会选择每个软件包的最新安装版本。
包版本是其定义的类型的一部分,因此ByteString
的{{1}}与bytestring-0.9.2.1
的{{1}}不同(或者您最新的任何类型)版本是)。
你可以
ByteString
标志编译程序(但可能是其他使用的软件包是针对不同的bytestring-0.10.0.0
版本构建的,那么这将不起作用。)-package bytestring-0.9.2.1
ized包,然后bytestring
将找出必要的Cabal
标志并将它们提供给GHC(如果它找到一致的构建计划)。cabal-install
版本重建-package
(可能还有很多其他软件包)。wai-extra
版本(可能需要使用旧版本重建某些软件包)。