如何从 Perl CGI 程序发送 JSON 响应?

Posted

技术标签:

【中文标题】如何从 Perl CGI 程序发送 JSON 响应?【英文标题】:How can I send a JSON response from a Perl CGI program? 【发布时间】:2010-09-30 22:19:22 【问题描述】:

我正在编写来自 perl/cgi 程序的 JSON 响应。标头的内容类型需要是“application/json”。但它似乎没有被识别,因为响应是作为文本文件抛出的。

我将使用 jQuery 的 JSON 库来捕获响应。我在发送 JSON 响应时遗漏了哪里。

【问题讨论】:

您如何发送响应?你在用 CGI.pm 吗? 是的。我使用第三个答案让它工作。还是谢谢你 你应该接受第三个答案(点击复选标记)。 显示您已经尝试过的示例代码通常很有帮助。 :) 还有第三个答案吗? 【参考方案1】:

我在 perl/cgi 程序中执行此操作。

我在代码的顶部使用这些:

use CGI qw(:standard);
use JSON;

然后我打印 json 标头:

print header('application/json');

这是一种内容类型:

Content-Type: application/json

然后我像这样打印出 JSON:

my $json->"entries" = \@entries;
my $json_text = to_json($json);
print $json_text;

我的 javascript 调用/处理它是这样的:

   $.ajax(
        type: 'GET',
        url: 'myscript.pl',
        dataType: 'json',
        data:  action: "request", last_ts: lastTimestamp ,
        success: function(data)
            lastTs = data.last_mod;
            for (var entryNumber in data.entries) 
                 //Do stuff here
            
        ,
        error: function()
            alert("Handle Errors here");
        ,
        complete: function() 
        
    );

如果您不想安装 JSON 库,则不一定非要使用它,您可以直接打印 JSON 格式的文本,但它可以很容易地将 perl 对象转换为 JSON。

【讨论】:

我的 JSON 中有错误。非常感谢,它就像一个魅力 您应该使用 'application/json' 作为标头,并找到一些方法在您的 Web 框架的请求中设置标头,因为打印标头不一定有效。【参考方案2】:

即使您指定类型“application/json”,您仍然需要解析文本。 jQuery 为您执行此操作,使用 $.getJSON 函数,即:

$.getJSON("http://someurl.com/blabla.json",some: "info",function(json)
  alert(json["aKey"]["anotherOne"]);
);

(这里是specs)。

但也许您已经意识到这一点,所以问题出在其他地方:您能否告诉我们您的 json 响应示例,因为问题可能是无效的。我不太清楚你为什么说“似乎没有被识别”:当我编写 json 服务时,我做的第一个测试是在浏览器上调用它们,也许会启动 firebug 并尝试解析它(所以是的响应这是一个文本响应,但是 javascript 它仍然很乐意解析它并返回一个 json 对象)。

【讨论】:

【参考方案3】:

下面是如何在 Perl 的 Web 框架 Mason 中生成请求。

Mason 类似于 Pylons 或 Ruby On Rails。

<%init>

use JSON;

my %hash =  a => 'a', b => 'b' ;
my @list = ( 1, 2, \%hash );

# Mason object $r for Apache requests, automatically sets the header
$r->content_type('application/json');

# Pass a reference to anything (list, hash, scalar) for JSON to encode
my $json = new JSON;
print $json->encode(\@list);

</%init>

然后在Prototype中处理,JavaScript网络抽象:

var req = new Ajax.Request('request.html', 
    method: 'get',
    parameters: 
        whatever: 'whatever'
    ,
    onCreate: function() 
        // Whatever
    ,
    onSuccess: function(response) 
        // This only works if you set the 'application/json' header properly
        var json = response.responseJSON;

        // Since you sent a list as the top-level thing in the JSON,
        // then iterate through each item
        json.each(function(item) 
            if (item instanceof Object) 
                item = new Hash(item);
             else if (item instanceof Array) 
                // Do array stuff
             else 
                // Do scalar stuff
            
        );
    ,
    onFailure: function() 
        // Failed
    
);

【讨论】:

以上是关于如何从 Perl CGI 程序发送 JSON 响应?的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 中,如何在命令行上发送 CGI 参数?

PHP:如何从 JSON 中获取变量(从 Swift iOS 应用程序发送)并以 JSON 响应

Perl CGI编程

如何根据请求从 JS 文件发送 JSON 响应?

如何从命令行测试Perl CGI脚本的文件上传?

分析超时的 Perl CGI 脚本