perl - 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
感谢您的时间和帮助。
解决方案
无需使用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);
...
}
推荐阅读
- javascript - 试图从异步函数返回对象数组,数组返回未定义
- angular-cli - Angular 11 CLI,“ng generate”选项:--skip-tests
- amazon-web-services - AWS Cognito 确认后触发多次
- windows-subsystem-for-linux - docker-desktop wsl 时间同步
- substrate - 如何确定基板中的多重签名帐户?
- azure-api-management - Azure API Manager 上不同 API 密钥的不同调用限制
- openstack - openstack 图像创建抛出 BadRequestException
- r - 我们可以将 h2o.train_segments 用于 h2o 的自动编码器吗?
- ios - genstrings -SwiftUI 不适用于按钮
- matlab - 如何更改 MATLAB UI 语言?