我想通过XMLHttpRequest将JSON对象发送到Perl脚本(* .cgi) 但我无法解码cgi文件中的JSON对象。
我总是反映错误信息:
格式错误的JSON字符串,无论是数组,对象,数字,字符串还是原子,都在字符偏移量0(之前) “(字符串结束)”)
这是我的javascript代码:
//ajax communication for receiver/transceiver
function doAjaxRequest(query)
{
if(whatReq == "")
{
alert('ERROR: Request-Type undefined');
return;
}
if (window.XMLHttpRequest)
{
arequest = new top.XMLHttpRequest(); // Mozilla, Safari, Opera
}
else if (window.ActiveXObject)
{
try
{
arequest = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
}
catch (e)
{
try
{
arequest = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
}
catch (e)
{
alert('ERROR: Request not possible');
return;
}
}
}
if (!arequest)
{
alert("Kann keine XMLHTTP-Instanz erzeugen");
return false;
}
else
{
var url = "****.cgi";
var dp = document.location.pathname;
arequest.open('post', url, true);
arequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
//receiver function
arequest.onreadystatechange = function()
{
switch (arequest.readyState)
{
case 4:
if (arequest.status != 200)
{
alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+arequest.status);
}
else
{
var content = arequest.responseText;
analyseResponse(content);
}
break;
default:
//alert("DEFAULT:" + arequest.readyState );
break;
}
}
//transceiver function
query="jsonObj=" + JSON.stringify({name:"John Rambo", time:"2pm"});
alert(query);
arequest.send(query)
}
}
这里是cgi文件:
#!/usr/bin/perl
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
use JSON;
use Data::Dumper;
my $jsonObj = param('jsonObj');
my $json = JSON->new->utf8;
my $input = $json->decode( $jsonObj );
print Dumper(\$input);
你能帮帮我吗?我不知道如何访问JSON对象。
非常感谢。
答案 0 :(得分:1)
此消息表明您在$jsonObj
中获得了非JSON字符串。一个特殊的常见情况是空字符串。尝试打印$jsonObj
的原始内容,并确保正确设置所有内容以使CGI::param
正常工作,并使用浏览器实际发送数据的内置工具进行检查。
另外,我强烈建议你扔掉10年前的ActiveX狗屎。您正在使用JSON.stringify
,并且所有支持它的浏览器也支持原生XMLHttpRequest
。
答案 1 :(得分:1)
由于insufficient information to reproduce and diagnose the problem,我即将投票将您的问题暂停,但后来我意识到您的问题确实包含足够的线索来弄清楚错误的原因 - 他们真的很隐蔽。
线索#1 :您的错误消息显示(强调我的):
格式错误的JSON字符串,既不是数组,对象,数字,字符串或原子,在字符偏移0处("(字符串结尾)")
这意味着您的$jsonObj
变量的长度为0,即它为空。
那么,导致它变空的原因是什么?好吧,Perl代码看起来像是完全标准的CGI内容,所以问题必须在你的JS代码中,或者在你的避风港没有向我们展示的东西中(例如你的web服务器配置)。既然我们无法调试我们无法看到的内容,那就让我们专注于您的JS代码,我们发现......
线索#2 :这条线路出了问题:
arequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
当然,你可以为POST请求设置any content type you want,但CGI.pm希望以HTML格式提交的标准格式之一接收内容,即{{3 }}。当它收到标记为 application / json 的内容时,它不知道如何解析它,因此不会。因此,Perl脚本中的param()
方法不会返回任何内容,因为就其而言,客户端没有发送任何可以理解的参数。
应该在您的网络服务器错误日志中某处发出警告,但您可能没想过要检查这些错误日志。 (提示:你真的应该!)
(您也可以使用either application/x-www-form-urlencoded or multipart/form-data来获取以HTML评论形式发送的警告,但我想您也不知道该选项。另外,为了使这项工作可靠,在 CGI模块之前,你真的需要use
CGI :: Carp ,以便它可以捕获任何早期错误。)
无论如何,修复很简单:只需将JS代码中的application/json
替换为application/x-www-form-urlencoded
,因为这就是您实际尝试发送到服务器的内容。您还应该通过将JSON.stringify()
的输出传递给encodeURIComponent()
来确保您的JSON数据 在将其嵌入请求之前进行了正确的URL编码,如下所示:< / p>
var data = {name:"John Rambo", time:"2pm"};
var query = "jsonObj=" + encodeURIComponent(JSON.stringify(data));
(我也是第二个Oleg V. Volkov的建议,要求摆脱JS代码中所有过时的ActiveX内容。事实上,你可以通过使用现代的JS实用程序库来做得更好比方说,jQuery提供了方便的包装函数,因此您甚至不必直接使用XMLHttpRequest。)