1

我想将客户端 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"} ];
4

1 回答 1

1

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

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

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});
   }
}
于 2012-12-10T22:38:44.073 回答