You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell如何发起HTTP GET请求并将ByteString响应转为字符串

解决方案

ByteString转String的实现

你现有代码中通过getResponseBody拿到的是严格ByteString类型值,转换为原生String有两种常用方式:

  • 快速测试场景:直接用Data.ByteString.Char8的unpack函数转换,注意该模块按单字节映射Char,仅能正确处理ASCII字符,非ASCII内容会乱码
  • 生产/正确处理编码场景:按JSON标准指定的UTF-8编码解码,避免乱码问题

快速测试版本代码:

{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Simple
import qualified Data.ByteString.Char8 as B8

main :: IO ()
main = do
  resp <- httpBS "https://aur.archlinux.org/rpc/?v=5&type=search&by=name-desc&arg=brave"
  -- 转换ByteString为普通String类型
  let respStr = B8.unpack $ getResponseBody resp
  -- respStr可直接传入后续纯JSON解析逻辑
  putStrLn respStr

UTF-8兼容版本代码(推荐):

{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Simple
import qualified Data.ByteString as BS
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE

main :: IO ()
main = do
  resp <- httpBS "https://aur.archlinux.org/rpc/?v=5&type=search&by=name-desc&arg=brave"
  let rawBs = getResponseBody resp
      -- 按UTF-8解码为Text类型,容错场景可替换为decodeUtf8'处理解码错误
      respText = TE.decodeUtf8 rawBs
      -- 需要原生String时调用unpack转换即可
      respStr = T.unpack respText
  print respStr

IO与纯逻辑的拆分逻辑

你提到的IO范畴无法直接执行纯操作的困惑,按以下规则写就不会出错:

  • 所有和外部系统交互的操作(发HTTP请求、读写文件、终端输入输出)必须放在IO上下文(比如main的do代码块,或者返回值为IO a类型的函数)中执行
  • 在IO代码块内拿到原始值后,通过let 变量名 = 纯函数 原始值的写法,就可以正常调用任意纯函数做数据转换、解析,不需要把所有处理逻辑都包装成IO类型
  • 后续写JSON解析逻辑时,可以单独定义纯函数,例如parseAurResponse :: String -> AurSearchResult,拿到respStr后直接传入即可,解析逻辑本身完全不需要涉及IO操作

补充提示:Haskell生态常用的JSON解析库(如aeson)原生支持直接解析ByteString/Text类型,不需要特意转成String,跳过转换步骤性能更好。


内容的提问来源于stack exchange,提问作者wreedb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:48:09