我正在使用Haskell通过http-client
包发送POST HTTP请求,但作为响应,我从远程服务器收到错误。我想检查我的请求,以确保我发送预期的参数。
我设法将我的请求绑定到Haskell解释器中的变量,但我无法弄清楚如何查看它的主体。当我在我的请求中使用requestBody
时,我得到类型RequestBody的值,但它不是show的实例。
在图书馆,我找不到任何有用的功能。只有许多构造函数,以及与Popper
类型相关的一些函数。
我如何检查该值?这似乎是一个常见的用例,但图书馆似乎并不支持它。我使用它错了吗?
我知道Wireshark是什么以及如何使用它,但我希望能够以编程方式检查我发送的内容
答案 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