如何检查使用`http-client`(Haskell)创建的传出HTTP请求的主体

时间:2016-04-03 22:32:59

标签: http haskell

我正在使用Haskell通过http-client包发送POST HTTP请求,但作为响应,我从远程服务器收到错误。我想检查我的请求,以确保我发送预期的参数。

我设法将我的请求绑定到Haskell解释器中的变量,但我无法弄清楚如何查看它的主体。当我在我的请求中使用requestBody时,我得到类型RequestBody的值,但它不是show的实例。

在图书馆,我找不到任何有用的功能。只有许多构造函数,以及与Popper类型相关的一些函数。

我如何检查该值?这似乎是一个常见的用例,但图书馆似乎并不支持它。我使用它错了吗?

编辑:

我知道Wireshark是什么以及如何使用它,但我希望能够以编程方式检查我发送的内容

1 个答案:

答案 0 :(得分:3)

RequestBody有五个构造函数。

data RequestBody
    = RequestBodyLBS L.ByteString
    | RequestBodyBS S.ByteString
    | RequestBodyBuilder Int64 Builder
    | RequestBodyStream Int64 (GivesPopper ())
    | RequestBodyStreamChunked (GivesPopper ())

前两个是bytestring的包装器,第三个是Blaze.ByteString.Builder,可以很容易地转换为bytestring,最后两个是(IO ByteString -> IO a) -> IO a类型的函数,类型同义词显示:

type Popper = IO S.ByteString
type NeedsPopper a = Popper -> IO a
type GivesPopper a = NeedsPopper a -> IO a

多次提供他们>>= print,您将把完整的请求正文打印到控制台。

您不应该这样做,因为这些GivesPopper ()生成器只能执行一次:如果您事先提取内容,那么请求正文将不会被发送到服务器。这就是为什么他们没有为RequestBody数据类型提供Show实例的原因。您可以更好地捕获包含您的http请求的存储桶,例如Wireshark

  

我的代码中有一个数据结构,我不知道为什么我不能检查它。你提到检查请求可能以某种方式消耗它。这在像Haskell这样的语言中很奇怪,其中不变性和明确的副作用是规则

对于Haskell中的大多数类型来说都是正确的,但是Popper实际上是IO S.ByteString,一个字节串流(通常)由文件处理程序填充,而Haskell中的处理程序是{ {1}}与命令式语言中的变量没有什么不同:它可以是值或null,可以分配和重新分配,副作用是全局可见的。

来自MVar的示例:

Network.HTTP.Client.MultipartFormData