Perl: Parse json ответ на следующий запрос curl - PullRequest
0 голосов
/ 12 марта 2020

Есть ли способ в perl разобрать json ответ на следующий запрос curl?

например,

У меня есть команда:

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» с предыдущего шага. Когда статус «ОБРАБОТАТЬ», я не хочу выходить из программы и запускать ее снова. Вместо этого я хочу подождать, пока статус не будет «ГОТОВО», а затем go для следующего шага

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

Я ценю ваше время и помощь.

1 Ответ

5 голосов
/ 12 марта 2020

Не нужно использовать curl. Используйте curl2lwp для перевода ваших запросов в Perl, используя LWP :: UserAgent .

. Используйте библиотеку для анализа 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);
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...