Использование Mojo :: UserAgent и доступ к JSON в ответ? - PullRequest
3 голосов
/ 29 января 2020

Как я могу получить доступ к JSON в ответе mojo?

$txn = $ua->post( $url, $headers, json => {json} )

Как можно получить ответ JSON от txn?

Ответы [ 2 ]

8 голосов
/ 29 января 2020

У меня есть несколько примеров в моей книге Mojolicious Web Clients , но вот сделка.

Когда вы делаете запрос, вы возвращаете объект транзакции:

my $ua = Mojo::UserAgent->new;
my $tx = $ua->post( ... );

У объекта транзакции есть и запрос, и ответ (главная особенность, которая отличает Mojo от LWP и даже других библиотек пользовательских агентов на других языках). Чтобы получить ответ, вы можете использовать методы res или result. result умрет за вас, если он не смог сделать запрос, потому что произошла ошибка соединения (ENONETWORK):

my $res = $tx->result;

Как только вы получите ответ, вы можете сделать несколько вещей (и это в разделе SYNOPIS Mojo :: UserAgent . Если вы хотите сохранить результат в файл, это просто:

$res->save_to( 'some.json' );

Вы можете превратить содержимое в DOM и извлечь части HTML или XML:

my @links = $res->dom->find( 'a' )->map( attr => 'href' )->each;

Для ответа JSON вы можете извлечь содержимое в Perl структуру данных:

my $data_structure = $res->json;

Однако, если вы хотите получить необработанное JSON (необработанное, незакодированное тело содержимого), то это тело сообщения запроса. Думайте об этом как буквальный, нефильтрованный текст:

use Mojo::JSON qw(decode_json);
my $raw = $res->body;
my $data_strcuture = decode_json( $raw );

, так как это объект ответа , Mojo :: Message и Mojo :: Message :: Response покажет, что вы можете сделать.

Вот полная тестовая программа:

#!perl
use v5.12;
use warnings;

use utf8;

use Mojo::JSON qw(decode_json);
use Mojo::UserAgent;
use Mojo::Util qw(dumper);

my $ua = Mojo::UserAgent->new;

my $tx = $ua->get(
    'http://httpbin.org/get',
    form => {
        name => 'My résumé'
        },
    );

die "Unsuccessful request" 
    unless eval { $tx->result->is_success };

my $data_structure = $tx->res->json;
say dumper( $data_structure );

my $raw = $tx->res->body;
say $raw;

my $decoded = decode_json( $raw );
say dumper( $decoded );
1 голос
/ 29 января 2020

Мне удалось получить доступ к этим данным следующим образом:

my $api_order = $tx_cart->result->json->{data};

Это в result, а не в body.

...