如何使用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
相关产品推荐
相关产品推荐

