使用 Mojo::UserAgent 并访问 JSON 作为响应?

Eva*_*oll 3 perl json http mojolicious mojo-useragent

如何在 mojo 响应中访问 JSON?

$txn = $ua->post( $url, $headers, json => {json} )
Run Code Online (Sandbox Code Playgroud)

从 txn 获取 JSON 响应的方法是什么?

bri*_*foy 9

我的书Mojolicious Web Clients 中有几个例子,但这是交易。

当您发出请求时,您会得到一个交易对象:

my $ua = Mojo::UserAgent->new;
my $tx = $ua->post( ... );
Run Code Online (Sandbox Code Playgroud)

事务对象同时具有请求和响应(这是 Mojo 与 LWP 甚至其他语言的其他用户代理库的主要区别)。要获得响应,您可以使用resresult方法。在result为你的模具,如果它不能使请求,因为发生了连接错误(ENONETWORK):

my $res = $tx->result;
Run Code Online (Sandbox Code Playgroud)

获得响应后,您可以执行多种操作(这些位于Mojo::UserAgent的 SYNOPIS 部分。如果您想将结果保存到文件中,这很简单:

$res->save_to( 'some.json' );
Run Code Online (Sandbox Code Playgroud)

您可以将内容转换为 DOM 并提取部分 HTML 或 XML:

my @links = $res->dom->find( 'a' )->map( attr => 'href' )->each;
Run Code Online (Sandbox Code Playgroud)

对于 JSON 响应,您可以将内容提取到 Perl 数据结构中:

my $data_structure = $res->json;
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要原始 JSON(原始的、未解码的内容正文),那就是请求的消息正文。把它想象成文字的、未经过滤的文本:

use Mojo::JSON qw(decode_json);
my $raw = $res->body;
my $data_strcuture = decode_json( $raw );
Run Code Online (Sandbox Code Playgroud)

由于这是响应对象,因此Mojo::MessageMojo::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 );
Run Code Online (Sandbox Code Playgroud)


Eva*_*oll 1

我能够像这样访问这些数据,

my $api_order = $tx_cart->result->json->{data};
Run Code Online (Sandbox Code Playgroud)

它在result不在body

  • `result` 返回实际的响应消息(或者如果没有响应则终止,例如连接或接收响应时出错)。响应消息对象有多个访问器以不同的方式访问消息正文,它们最终都作用于“body”,即消息正文的原始字节字符串:“body”、“text”、“json”、“dom”。事务对象存储的是这个响应消息和请求消息,而不是这些内容。 (3认同)