Отладка HTTP :: Tiny - PullRequest
       7

Отладка HTTP :: Tiny

1 голос
/ 26 мая 2019

Я использую HTTP :: Tiny для взаимодействия с остальными 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-запрос, который я отправляю, используя HTTP :: Tiny, без необходимости использования другого инструмента, такого как wireshark и т. Д. что-то вроде того, что mojo :: useragent достигает с MOJO_CLIENT_DEBUG = 1, любая идея?

1 Ответ

2 голосов
/ 26 мая 2019

Я не вижу такой возможности, упомянутой в документации 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, так что наш насмешливый методМетод становится оберткой вокруг исходного метода, и мы можем выгрузить базовый объект и аргументы, переданные в метод.Я делаю дамп до выполнения запроса, но я мог бы сделать начальный дамп, получить возвращаемое значение реального запроса, а затем снова сбросить объект, если бы подумал, что он может содержать дополнительную полезную информацию.Пока мы возвращаем фактический ответ, вызывающий код не является мудрым.

Вот пример вывода.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 кажется довольно хорошим выбором.для большинства случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...