我在以下示例中使用HTTP :: Tiny与rest api进行交互:
my $req = $ua->get('https://myapi.com/user?xyz', {headers =>
{token => 'xyzzz',
data => '5343'.
}});
我正在使用Data :: Dumper查看响应标头和正文
print Dumper($req); -#i can see the response
是否有一个选项可以查看我正在使用HTTP :: Tiny发送的HTTP请求,而无需其他工具,例如Wireshark等。 像mojo :: useragent通过MOJO_CLIENT_DEBUG = 1可以实现什么想法?
答案 0 :(得分:2)
我没有在HTTP :: Tiny文档中看到这样的功能,也没有在模块的源代码中看到它的便利。但是,您可以使用诸如Test :: MockModule之类的模块来仔细查看发生了什么。这是一个示例:
#!/usr/bin/env perl
use strict;
use warnings;
use HTTP::Tiny;
use Test::MockModule;
use Data::Dumper;
my $t = HTTP::Tiny->new();
my $mock = Test::MockModule->new('HTTP::Tiny');
$mock->redefine('_request' => sub {
warn "In _request: ", Dumper {self => $_[0], method => $_[1], url => $_[2], args => $_[3]};
return $mock->original('_request')->(@_);
});
print "Response: ", Dumper $t->get('http://localhost:3000');
因此,在此代码段中,我们正在模拟_request
,但是我们代表_request
安装的模拟方法调用了原始的_request
方法,因此我们的模拟方法成为了包装原始方法,我们可以转储传递给该方法的基础对象和args。我在发出请求之前就进行了转储,但是我可以完成初始转储,捕获实际请求的返回值,然后如果我认为它可能包含其他有用的信息,则随后再次转储该对象。只要我们返回实际的响应,调用代码都不是明智的选择。
这是输出示例。我点击的URL只是默认的Mojolicious :: Lite应用。
In _request: $VAR1 = {
'method' => 'GET',
'self' => bless( {
'agent' => 'HTTP-Tiny/0.076',
'no_proxy' => [],
'max_redirect' => 5,
'keep_alive' => 1,
'verify_SSL' => 0,
'timeout' => 60
}, 'HTTP::Tiny' ),
'args' => {},
'url' => 'http://localhost:3000'
};
Response: $VAR1 = {
'headers' => {
'content-length' => '146',
'content-type' => 'text/html;charset=UTF-8',
'server' => 'Mojolicious (Perl)',
'date' => 'Sun, 26 May 2019 03:19:57 GMT'
},
'protocol' => 'HTTP/1.1',
'reason' => 'OK',
'url' => 'http://localhost:3000',
'success' => 1,
'status' => '200',
'content' => '<!DOCTYPE html>
<html>
<head><title>Welcome</title></head>
<body><h1>Welcome to the Mojolicious real-time web framework!</h1>
</body>
</html>
'
};
在我能够知道_request
是我的目标目标之前,我不得不看一下HTTP :: Tiny的源代码。幸运的是,模块的::Tiny
部分意味着没有很多需要看的东西。这确实是一个相对简单的模块。
您可能会决定出于您自己的目的,在HTTP :: Tiny的其他位置引入包装器更有意义,但是在大多数情况下,包装_request
似乎是一个不错的选择。