Perl(Mojolicious框架)接收JSON并模板渲染代码正确性排查
修正你的Perl Mojolicious数据渲染代码
我帮你梳理下代码里的几个关键问题,然后给出修正后的版本,这样就能正常从远程接口获取数据并渲染到模板了:
后端代码的问题与修正
你的原代码有几个核心问题:
- 没有把接口返回的JSON字符串解析成Perl可操作的数据结构,直接存了字符串到stash
- 混用了
JSON::XS和JSON两个模块,其实Mojolicious自带了更适配的Mojo::UserAgent和Mojo::JSON - 没有处理请求失败的场景,比如接口超时或返回错误码时会直接报错
- 超时设置不合理(3000秒太长,应该是30秒左右)
修正后的后端代码:
my $self = shift; # 使用Mojolicious自带的UserAgent,更贴合框架生态 my $ua = Mojo::UserAgent->new; $ua->request_timeout(30); # 设置合理的超时时间(30秒) $ua->insecure(1); # 禁用SSL证书验证,替代原LWP的复杂配置 # 发送请求并获取结果 my $res = $ua->get('https://jsonplaceholder.typicode.com/comments')->result; if ($res->is_success) { # 直接用json()方法把响应解析成Perl数组引用(接口返回的是评论数组) my $comments = $res->json; $self->stash('comments' => $comments); } else { # 处理请求失败的情况,给模板传递空数组和错误信息 $self->stash( 'comments' => [], 'error' => "接口请求失败: " . $res->message ); } $self->render('view_'); return;
模板代码的问题与修正
原模板的循环逻辑错误:
- 接口返回的是数组,不是带
element键的哈希 - 原
$body是未解析的JSON字符串,不能直接用哈希引用的方式访问
修正后的模板代码:
<% # 先处理错误情况 %> % if (stash('error')) { <div class="alert alert-error"> <%= stash('error') %> </div> % } <% # 循环遍历评论数组 %> <% foreach my $comment (@{stash('comments')}) { %> <div class="comment-card"> <h3><%= $comment->{name} %></h3> <p class="comment-email"><%= $comment->{email} %></p> <p class="comment-body"><%= $comment->{body} %></p> </div> <% } %>
关键说明
- 数据解析:Mojo::UserAgent的
json()方法会自动把JSON响应转换成Perl的数组/哈希引用,无需手动调用JSON模块解析 - 错误处理:增加请求失败的分支,避免模板因数据为空或无效而崩溃
- 模板逻辑:直接遍历解析后的评论数组,访问接口返回的真实字段(
name、email、body都是jsonplaceholder接口返回的字段)
内容的提问来源于stack exchange,提问作者user1234
相关产品推荐
相关产品推荐

