2015-12-10 38 views
2

我想通過XMLHttpRequest發送一個JSON對象到Perl腳本(* .cgi) 但我無法解碼cgi文件中的JSON對象。Ajax通信:Perl格式錯誤的JSON字符串

我總是reveive錯誤消息:

畸形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

我們需要看到JSON字符串。嘗試打印它。但是有人猜測 - 因爲你把它作爲一個參數,它是URI編碼的。你必須先解碼。 – Sobrique

+0

你不需要'arequest.send(「jsonObj =」+查詢)'? –

+0

我開始查詢前做一個警示:JSON \t \t 名 \t「約翰·蘭博」 \t 時間 \t「14:00」 – Ulf

回答

1

此消息表明您在$jsonObj中獲得了非JSON字符串。一個特別常見的情況是空字符串。嘗試打印出$jsonObj的原始內容,並確保爲CGI::param正確設置所有內容,並檢查瀏覽器內置的實際發送數據的工具。

另外我強烈建議你丟掉10歲的ActiveX狗屎。您正在使用JSON.stringify,並且支持它的所有瀏覽器也支持本地XMLHttpRequest

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"); 
    

當然,你可以設置any content type you want POST請求,但CGI.pm希望以HTML表單提交的標準格式之一接收內容,即either application/x-www-form-urlencoded or multipart/form-data。當它收到標記爲application/json的東西時,它不知道如何解析它,所以不會。因此,Perl腳本中的param()方法將不會返回任何內容,因爲就其而言,客戶端未發送任何可以理解的參數。

還有應該已經在您的Web服務器錯誤日誌中的某處發出警告,但您大概沒有想過檢查這些內容。 (提示:你真的應該!)

(你也可以使用the warningsToBrowser option of CGI::Carp來獲取HTML註釋的警告信息,但我想你也不知道這個選項。 ,你真的需要use CGI ::鯉魚前的CGI模塊,以便它可以捕捉任何前期差錯)

無論如何,修復很簡單:只是application/x-www-form-urlencoded取代application/json在你的JS代碼,因爲這就是你實際想要發送給服務器的東西。你還應該確保你的JSON數據實際上是正確通過encodeURIComponent()嵌入它的要求,通過傳遞JSON.stringify()輸出,這樣才URL編碼:

var data = {name:"John Rambo", time:"2pm"}; 
var query = "jsonObj=" + encodeURIComponent(JSON.stringify(data)); 

(我會還第二奧列格V. Volkov建議擺脫JS代碼中所有過時的ActiveX事件,事實上,通過使用一個現代的JS實用程序庫(比如說jQuery)可以做得更好,它提供了方便的包裝函數,所以你不需要甚至不得不直接混淆XMLHttpRequest。)