如何在Haskell中按原样处理和保存HTTP正文?

时间:2013-09-10 21:15:43

标签: http haskell encoding

我尝试使用以下代码来下载HTML,但它实际上将非ASCII字符转换为一系列解码后的字符,例如< U + 009B>和0033200400 \ 0031 \ 0031。

openURL x = getResponseBody =<< simpleHTTP (getRequest x)

download url path = do src <- openURL url
                     writeFile path src

如何更改以下代码以完全按照收到的方式编写HTTP响应?如何在这样的内容中搜索和操纵字符串?

1 个答案:

答案 0 :(得分:1)

字符串输出如“\ 1234 \ 5678”实际上只有两个字符长 - 数据被保留,但您需要正确解释它。可能最好的方法是使用Text,而不是Char的列表,实际上是一个表示UTF-8代码点的字节数组。

为此,您需要在HTTP mkRequest :: BufferType ty => RequestMethod -> URI -> Request ty中使用稍微更通用的界面。 Text不直接实例化BufferType,因此我们将通过表示二进制数据块的ByteString - 它没有对该数据的编码进行特定解释。

然后我们可以使用decodeUtf8将原始字节转换为UTF-8 Text

import Data.Text
import Data.Text.Encoding
import Data.ByteString

\ uri -> do
  rawData <- getResponseBody =<< simpleHTTP (mkRequest GET uri) :: IO Text
  return (decodeUtf8 rawData)

请注意decodeUtf8是部分的 - 它可能会失败,无法在纯代码中捕获,要求在IO堆栈中一直重启或处理程序。如果这是不合需要的,如果您下载的文本很可能是UTF-8无效的,那么您可以使用decodeUtf8'返回Either

相关问题