You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LWP::UserAgent获取NOAA服务器的JSON文件?

问题分析与解决步骤

你的脚本当前的问题是直接打印了LWP::UserAgent和HTTP::Response对象,Perl默认只会输出这些对象的内存引用标识,而非你需要的JSON内容。另外还存在一个逻辑错误:先创建UA并发起请求,之后又重新创建了一个新UA,第二个UA完全没被用来发起请求,属于无效操作。

按以下步骤修改即可解决问题:

1. 修正UA创建逻辑

删除重复创建UA的代码,仅保留配置了CA路径的UA实例,用它发起请求。

2. 正确处理HTTP响应

发起请求后,先判断请求是否成功,再获取响应的实际内容(即目标JSON字符串):

  • 用$res->is_success检查请求状态
  • 用$res->content获取响应的原始文本内容

3. (可选)解析JSON内容

如果需要将JSON转换为Perl可直接操作的数据结构(哈希/数组),需引入JSON模块进行解码。

修正后的完整脚本

#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;
# 如需解析JSON,引入JSON模块
use JSON;

# 仅创建一次配置好的UA实例
my $ua = LWP::UserAgent->new(
    ssl_opts => {
        SSL_ca_path     => '/etc/ssl/certs',
        verify_hostname => 1,
    }
);

# 使用配置好的UA发起请求
my $res = $ua->get("https://services.swpc.noaa.gov/products/alerts.json");

print "Content-type: text/html\n\n";

# 处理请求结果
if ($res->is_success) {
    my $json_content = $res->content;
    print "Alert JSON内容:<br>\n";
    # 用<pre>标签格式化输出原始JSON,保证可读性
    print "<pre>$json_content</pre>\n";

    # (可选)将JSON解析为Perl数据结构
    my $data = decode_json($json_content);
    print "<br>解析后的Perl数据示例:<br>\n";
    # 示例:打印第一个警报的核心信息(根据JSON结构调整)
    if (ref $data eq 'ARRAY' && @$data) {
        print "第一个警报ID: " . $data->[0][0] . "<br>\n";
        print "第一个警报内容: " . $data->[0][2] . "<br>\n";
    }
} else {
    # 请求失败时输出错误信息
    print "请求失败,错误码: " . $res->code . "<br>\n";
    print "错误信息: " . $res->message . "<br>\n";
}

exit;

关键说明

  • 移除了重复创建UA的冗余代码,确保使用正确配置的实例发起请求
  • 添加了请求状态判断,避免请求出错时输出混乱内容
  • 用<pre>标签包裹原始JSON,保证输出格式清晰易读
  • 可选的JSON解析部分,帮助你直接操作JSON中的具体数据

内容的提问来源于stack exchange,提问作者Konabob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:52:40