如何使用putStrLn或类似函数打印wreq响应内容至终端?
正确打印wreq响应内容的方法
嘿,我来帮你搞定wreq响应打印的问题!你遇到的报错大概率是因为对wreq的Response结构和ByteString的处理方式理解有点偏差,咱们一步步来修正:
首先得明确两个核心点:
- wreq返回的
Response对象本身不是ByteString,它的responseBody字段才是真正的响应内容(默认是Data.ByteString.Lazy.ByteString,也就是懒加载的ByteString类型) - 直接用
unpack会报错,要么是你没导入对应ByteString模块的unpack函数,要么是误把整个Response对象当成ByteString来处理了
第一步:导入必要的模块
你的main.hs需要补充这些导入:
{-# LANGUAGE OverloadedStrings #-} import Network.Wreq (get) import Control.Lens ((^.)) -- 用来访问Response里的字段(wreq依赖lens来做字段访问) import Network.Wreq.Types (responseBody) import Data.ByteString.Lazy.Char8 (unpack) -- 专门处理懒ByteString的unpack函数 -- 要是你需要处理UTF-8编码的文本,也可以用这组替代上面的bytestring导入: -- import Data.Text.Encoding (decodeUtf8) -- import Data.Text (unpack) -- import qualified Data.ByteString.Lazy as L
第二步:完整的示例代码
下面是能正常运行的完整代码,发起GET请求并打印响应内容:
{-# LANGUAGE OverloadedStrings #-} import Network.Wreq (get) import Control.Lens ((^.)) import Network.Wreq.Types (responseBody) import Data.ByteString.Lazy.Char8 (unpack) main :: IO () main = do -- 发起GET请求,拿到Response对象 resp <- get "https://example.com" -- 提取响应体(ByteString),转成String后打印 putStrLn $ unpack (resp ^. responseBody) -- 如果你想直接打印原始ByteString(会显示字节的转义格式,适合看二进制数据,不推荐文本): -- print (resp ^. responseBody) -- 处理UTF-8文本的另一种更规范的方式: -- let strictBody = L.toStrict $ resp ^. responseBody -- textBody = decodeUtf8 strictBody -- putStrLn $ unpack textBody
第三步:确保项目依赖正确
不管用.cabal还是stack,都需要把依赖加上。如果是.cabal文件,在build-depends里添加:
build-depends: base >= 4.14 && < 5, wreq >= 0.5, lens, bytestring, text -- 用Text处理的话需要加这个
如果用stack,它会自动解析依赖,但你也可以在stack.yaml的extra-deps里指定版本(一般不需要,stack会找兼容的版本)。
常见错误排查
- 你可能试过直接
unpack resp,但resp是Response ByteString类型,不是ByteString,必须用resp ^. responseBody提取出响应体 - 如果用了
Data.ByteString.unpack(严格ByteString的unpack)去处理懒ByteString,会类型不匹配报错,要对应用Data.ByteString.Lazy.Char8.unpack - 忘记导入
Control.Lens的(^.)运算符,导致无法访问responseBody字段,这也是常见编译错误
按照上面的修改,再用stack build编译应该就能正常运行,把响应内容打印到终端啦!
内容的提问来源于stack exchange,提问作者Mark Karavan
相关产品推荐
相关产品推荐

