1

クライアント側のJSONデータをサーバーに投稿し、そこでcgi-binperlスクリプトによって読み取られます。サーバー側でデータを読み取る方法の例を探していましたが、何も見つかりませんでした。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

また、dojoKitxhrPostのドキュメントが少し曖昧だと感じています。ただし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 に答える