Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查使用“HTTP客户端”(Haskell)创建的传出HTTP请求的主体_Http_Haskell - Fatal编程技术网

如何检查使用“HTTP客户端”(Haskell)创建的传出HTTP请求的主体

如何检查使用“HTTP客户端”(Haskell)创建的传出HTTP请求的主体,http,haskell,Http,Haskell,我使用Haskell通过包发送POST HTTP请求,但作为响应,我从远程服务器收到一个错误。我想检查我的请求,以确保我正在发送正文中的预期参数 我设法将请求绑定到Haskell解释器中的一个变量,但我不知道如何查看它的主体。当我在请求中使用requestBody时,我得到一个type值,但它不是show的实例 在图书馆里我找不到任何有用的功能。只有许多构造函数,以及一些与Popper类型相关的函数 如何检查该值?对我来说,这似乎是一个常见的用例,但库似乎不支持它。我用错了吗 编辑: 我知道Wi

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

我设法将请求绑定到Haskell解释器中的一个变量,但我不知道如何查看它的主体。当我在请求中使用
requestBody
时,我得到一个type值,但它不是show的实例

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

如何检查该值?对我来说,这似乎是一个常见的用例,但库似乎不支持它。我用错了吗

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

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请求的bucket,例如


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

这对于Haskell中的大多数类型都是正确的,但实际上,
Popper
ios.ByteString
,一个由文件处理程序填充的ByteString流(通常),而Haskell中的处理程序是一个
MVar
,它与命令式语言中的变量没有太大区别:它可以是值或null,可以分配和重新分配,并且副作用在全局可见

Network.HTTP.Client.MultipartFormData
中的一个示例:

streamFile :: FilePath -> GivesPopper ()
streamFile fp np =
    withFile fp ReadMode $ np . go
  where
    -- go :: Handle -> Popper 
    go h = BS.hGetSome h defaultChunkSize

我知道这不是你想要的,但如果你只是想调试你的服务器,你可能会做得比嗅探流量和查看流量更糟糕,例如,对,我可以在构造函数上进行模式匹配,并获得ByteString!我一开始没想到这个!暗示线鲨就像是投降。我的代码中有一个数据结构,我不明白为什么我不能检查它。您提到检查请求可能会以某种方式消耗它。这在Haskell这样的语言中是很奇怪的,其中不变性和明显的副作用是规则我让库作者参与了讨论也许我可以用a和a,但是我不确定如何使用
dummyConnection
@danza我不认为
dummyConnection
会将请求发送到任何远程服务器,
requestBuilder
无论如何都会使用该请求。一种解决方案可能是生成两次完全相同的请求(如果您的程序中有可能),并打印其中一个请求的
RequestBody
,然后发送到另一个服务器。您肯定无法继续执行
show::RequestBody->String
操作。我希望使用
dummyConnection
以便在不进入不同构造函数的情况下获得请求的序列化,我现在不在乎将其发送到服务器,而且我在使用它时没有问题。最后,我设法将它序列化,编写了一个部分函数,提取了strict bytestring。我发现在我的案例中,那就是构造器。非常感谢你的支持,我迷路了!