【问题标题】:Server side processing for dojo ajaxdojo ajax 的服务器端处理
【发布时间】:2012-11-28 08:18:56
【问题描述】:

我想将客户端 JSON 数据发布到它所在的服务器 将由 cgi-bin perl 脚本读取。一直在找例子 关于如何在服务器端读取数据但一无所获。我是 使用 dojo 版本 1.8.1....

我可以看到请求来自服务器端的 cgi 脚本,但搜索输入值没有发现 JSON 数据。

在服务器端,我可以看到从 url 属性传递的 'cmd' 参数,我还看到没有数据的 '1'。我已经在服务器端下载并安装了 JSON.pm,但在 POST 之后无法从客户端找到 JSON 数据。

服务器端 perl 脚本如何读取客户端发布的 JSON 数据??

谢谢!!!

var xhrArgs = {
   url: "/cgi-bin/DataExport.cgi?cmd=file",
   content: xfer_data,
       headers: { \"Content-Type\": \"application/json; charset=utf-8\"},
   load: function(data) {
       alert('Posted!' + data);
   },
   error: function(error) {
       alert('Error! ' + error);
   }
 };
 dojo.xhrPost(xhrArgs);

更新..

修改dojo版本1.8.1的代码:

require(["dojo/request"], function(request){
  var promise = request.post("/cgi-bin/DataExport.cgi", {
    data: xfer_data,
    timeout: 4000
     });
  promise.response.then(function(response){
    var message = response.data;
    alert(message);
 });
});

我仍然在服务器端的 $ENV{'QUERY_STRING'} 中看不到任何内容。这 请求通过但我仍然找不到任何 JSON 数据???

var xfer_data = [ {"ID":"1",
"Device #":"176",
"Access #":"002-20",
"Address":"MH48 STEWART & CRANDON",
"TP":"MF",
"Curr":" ",
"Last":" ",
"Tdy":"8.6",
"-1":"8.6",
"-2":"8.6",
"-3":"8.6",
"-4":"8.6",
"-5":"8.6",
"-6":"8.6",
"Wk-1":"8.6",
"Wk-2":"8.6",
"Wk-3":"8.6",
"Wk-4":"8.6",
"Alarm":" R ",
"In":"14"} ];

【问题讨论】:

    标签: json perl dojo cgi


    【解决方案1】:

    我还发现 dojoKit xhrPost 文档有点含糊。但是content 接受名称、值对;我认为它应该将这些作为表单字段发回。

    xhrPost 方法似乎不会自动将对象序列化为 JSON 字符串。为了安全起见,我会先这样做。我正在使用 dojo.toJson 方法,我发现该方法记录在 here 并假设是可用的。

    var xfer_data = [ {"ID":"1",
    "Device #":"176",
    "Access #":"002-20",
    "Address":"MH48 STEWART & CRANDON",
    "TP":"MF",
    "Curr":" ",
    "Last":" ",
    "Tdy":"8.6",
    "-1":"8.6",
    "-2":"8.6",
    "-3":"8.6",
    "-4":"8.6",
    "-5":"8.6",
    "-6":"8.6",
    "Wk-1":"8.6",
    "Wk-2":"8.6",
    "Wk-3":"8.6",
    "Wk-4":"8.6",
    "Alarm":" R ",
    "In":"14"} ];
    
    var xfer_data_json = dojo.toJson( xfer_data );
    
    var xhrArgs = {
       url: "/cgi-bin/DataExport.cgi?cmd=file",
       content: {data: xfer_data_json},
       load: function(data) {
         alert('Posted!' + data);
       },
       error: function(error) {
         alert('Error! ' + error);
       }
     };
     dojo.xhrPost(xhrArgs);
    

    perl 端然后变成常规的 CGI 处理,需要反序列化 JSON 数据(也未经测试):

    #!/usr/bin/perl
    use warnings; use strict;
    use CGI;
    use JSON;
    
    my $cgi = CGI->new;
    
    if ($cgi->param('cmd') eq 'file') {
       my $data_json = $cgi->param('data');
       my $devices = JSON::from_json( $data_json );
    
       foreach my $device (@$devices) {
            printf ("device: id=%s access=%s address=%s\n", $device->{ID}, $device->{Access}, $device->{Address});
       }
    }
    

    【讨论】:

    • 另请注意:xhrPost 文档指出它已贬值以支持 xhr dojotoolkit.org/reference-guide/1.8/dojo/request/…
    • 尝试了您的示例,但仍然只能在 QUERY_STRING $ENV{'QUERY_STRING'} 中看到 cmd=file。刚刚在文档中注意到折旧,所以我将代码转换为请求。有趣的是,如果我将请求更改为 dojo.xhrGet() 我会在服务器上的 perl 脚本中收到更多数据:QUERY_STRING = cmd=file&0=%5Bobject%20Object%5D
    • @GoinOff 关于 QUERY_STRING 当您使用带有 HTTP POST 方法的 CGI 时,表单数据可能会通过查询字符串和 STDIN 传输;我想你会发现 xhrPost 正在通过 STDIN 发送一些数据。但是 HTTP PUT 方法需要将所有内容都压缩到 xhrGet() 正在执行的 QUERY_STRING 中。
    • @GoinOff 感谢您提供更多信息。我会说,鉴于您看到 'object%20object...' dojo 不会为您处理 JSON 序列化。我会更新我的答案。
    • 感谢 snoopy,越来越近地修改了我的客户端请求。见原帖。
    猜你喜欢
    • 2011-01-03
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多