首页 > 解决方案 > Perl:为下一个 curl 请求解析 json 响应

问题描述

perl 中有没有办法解析下一个 curl 请求的 json 响应?

例如

我有一个命令:

curl -H "Content-Type: application/json" -H "Authorization: Bearer DS_12345" -X GET https://api.xxx

回应是:

{
  "method":"a",
  "users":["user@xxx.com "],
  "status":"DONE",
  "export-url":"https://api.xxx/v1/export/DP_6789xxx"
}

当(等到)响应包含“status”:“DONE”,而不是“FAIL”或“PROCESSING”时,通过响应“export-url”运行下一步:“ https://api.xxx/v1/ export/DP_6789xxx "来自上一步。当状态为“PROCESSING”时,我不想退出程序并再次运行它。相反,我想等到状态为“完成”后再进行下一步

curl -H "Content-Type: application/json" -H "Authorization: Bearer DS_12345" -X GET https://api.xxx/v1/export/DP_6789xxx?view=xml

感谢您的时间和帮助。

标签: perl

解决方案


无需使用curl. 使用curl2lwp将您的请求转换为使用LWP::UserAgent的 Perl 。

使用库来解析 JSON。在这里,我使用了Cpanel::JSON::XS,但是对于像这样的简单东西,其他任何东西都应该可以工作。

#!/usr/bin/perl
use strict;
use warnings;

use LWP::UserAgent;
use Cpanel::JSON::XS;

my $ua = 'LWP::UserAgent'->new(send_te => 0);
my $req = 'HTTP::Request'->new(
    GET => 'https://api.xxx/',
    [
        'Accept'        => '*/*',
        'Authorization' => 'Bearer DS_12345',
        'Host'          => 'api.xxx:443',
        'User-Agent'    => 'curl/7.55.1',
        'Content-Type'  => 'application/json',
    ],

);
my $res = $ua->request($req);
die $res->status_line unless $res->is_success;

my $response_structure = decode_json($res->decoded_content);
if ($response_structure eq 'DONE') {
    my $req = 'HTTP::Request'->new(
        GET => $response_structure->{'export-url'} . '?view=xml',
        [
            'Accept'        => '*/*',
            'Authorization' => 'Bearer DS_12345',
            'Host'          => 'api.xxx:443',
            'User-Agent'    => 'curl/7.55.1',
            'Content-Type'  => 'application/json',
        ],

    );
    my $res = $ua->request($req);
    ...
}

推荐阅读