2011-06-23 126 views
0

我試圖看到使用XMLHttpRequest發送到服務器的json數據,但似乎服務器沒有收到它,當我運行JavaScript警報窗口會彈出,但不會打印任何東西。任何人都知道如何解決這個問題?由於使用POST方法從JavaScript將json數據發送到服務器的問題

在客戶端,Java腳本的

var obj = {"action": "nothing"}; 

var jsonString = "jsonString=" + JSON.stringify(obj); 


var xmlhttp = new XMLHttpRequest(); 

xmlhttp.open("POST","http://myserver/main.php",true); 

xmlhttp.setRequestHeader("Content-type","application/json"); 
xmlhttp.setRequestHeader("Content-Length",jsonString.length); 

xmlhttp.onreadystatechange = function() 
{   
     if(xmlhttp.readyState === 4 && xmlhttp.status === 200){ 
      alert(xmlhttp.responseText); 
     } 
} 
xmlhttp.send(jsonString); 

在服務器上,PHP

if(isset($_POST['jsonString'])) 
echo $_POST['jsonString']; 
+0

'application/x-www-form-urlencoded'表示你必須urlencode字符串:'encodeURIComponent(JSON.stringify(obj))'。你也應該發送Content-Length:'xmlhttp.setRequestHeader(「Content-Length」,jsonString.length);'。並在'xmlhttp.onreadystatechange'中檢查'xmlhttp.status === 200'。 – Saxoier

+0

@Saxoier謝謝我只是根據你的指示編輯了我的代碼,但不幸的是它仍然不能正常工作 – totalnoob

+0

你的第一個版本已經工作了。也許你用apache的mod_rewrite('RewriteRule',...)或mod_alias('Redirect',...)重定向。然後,您可能會創建一個額外的GET-Request並釋放所有POST數據。看看Firebug-> Network。此請求不應該有3xx HTTP狀態碼。 – Saxoier

回答

1

你發送JSON數據,但在內容類型設置爲application/x-www-form-urlencoded。您應該發送格式/編碼的數據(var obj="action=nothing")或設置內容類型,以JSON(application/json

+0

謝謝我只是將其更改爲application/json,但它仍然不起作用 – totalnoob

+0

不,內容類型是application/x-www-form-urlencoded – James

0

這是爲我工作:

<html> 
<head> 
<script src='json.js'></script> 
</head> 
<body> 

<script> 
var obj = {"action": "nothing"}; 
var jsonString = "jsonString=" + JSON.stringify(obj); 
var xmlhttp = new XMLHttpRequest(); 
xmlhttp.open("POST","whereIPutThePHP.php",true); 
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
xmlhttp.setRequestHeader("Content-Length",jsonString.length); 

xmlhttp.onreadystatechange = function() 
{   
     if(xmlhttp.readyState === 4 && (xmlhttp.status === 200)){ 
      alert(xmlhttp.responseText); 
     } 
} 
xmlhttp.send(jsonString); 
</script> 

</body> 
</html> 
1

詹姆斯的解決方案工作得很好,但如果你是希望使用application/json內容類型發送數據,那麼您必須以不同的方式訪問數據。

對於你所擁有的服務器端,

if(isset($_POST['jsonString'])) 
echo $_POST['jsonString']; 

改變這種(像詹姆斯一樣):

xmlhttp.setRequestHeader("Content-type","application/json"); 

xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 

如果您想使用的應用程序/ json內容類型,那麼你必須改變你如何訪問它的服務器端:

$json_string = file_get_contents('php://input'); 
    $json_object = json_decode($json_string); 
    echo $json_object->action; 
相關問題