调试HTTP :: Tiny

时间:2019-05-25 23:14:13

标签: perl https

我在以下示例中使用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可以实现什么想法?

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似乎是一个不错的选择。