如何从 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 响应?的主要内容,如果未能解决你的问题,请参考以下文章