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

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>
<% } %>

关键说明

  1. 数据解析:Mojo::UserAgent的json()方法会自动把JSON响应转换成Perl的数组/哈希引用,无需手动调用JSON模块解析
  2. 错误处理:增加请求失败的分支,避免模板因数据为空或无效而崩溃
  3. 模板逻辑:直接遍历解析后的评论数组,访问接口返回的真实字段(name、email、body都是jsonplaceholder接口返回的字段)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:11:16