【问题标题】:Perl: Parse json response for next curl requestPerl:为下一个 curl 请求解析 json 响应
【发布时间】:2020-03-12 09:13:41
【问题描述】:

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”时,我不想退出程序并再次运行它。相反,我想等到状态为“DONE”,然后再进行下一步

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

感谢您的宝贵时间和帮助。

【问题讨论】:

    标签: perl


    【解决方案1】:

    无需使用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);
        ...
    }
    

    【讨论】:

    • 如果有一个curl2curl 命令会很好地生成 Net::Curl 代码而不是 LWP::UserAgent 代码! (Net::Curl 速度更快,并且支持并行请求。)
    • @ikegami: 试一试Corion ;-)
    • 或者我自己写,呵呵
    • 你不是在decode_json($res) 中缺少->decoded_content 吗?此外,->is_success 之前可能是一个合理的想法。
    • 非常感谢@choroba。状态可能是“处理中”,为此,我不想退出程序,而是想等到它完成(状态:完成)然后进入下一步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2023-03-08
    • 2021-12-01
    • 1970-01-01
    • 2016-12-12
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多