詢問一個關於JS AJAX POST Json資料,PHP接收資料的方法
先說一下,我是直接用JS,沒有用其他庫,所以麻煩大家不要用其他庫來做為例子
問題是這樣,我用JS指令碼寫了一個AJAX方法如下
var pageNow=this.className.substr(4);
var dID=document.getElementById("dID").value;
var url="OOXX";
var jsonData={
"HdType":"3",
"dID":dID,
"content":content
};
var data={data:jsonData};
var contentType="application/json";
var ajax=new Simple.Ajax("POST", url, receive4, data,contentType); //receiveInfo是一個方法名
ajax.SendRequest();
裡面Simple.Ajax是封裝好了的,方法中receive4是AJAX回調方法,contentType是資料頭,data就是我要發送的資料.大概能看得懂吧..
我舉個例子,之前我用POST發送簡單資料的時候,data的格式就是"key1=value1&key2=value2"這樣,然後服務端用PHP的擷取方法就是$_POST["key1"],或者$_POST["key2"]這樣子
現在考慮到value1或者value2的值本身就可能包含"&"這個符號,所以想用JSON一次把整個對象POST到伺服器,但是現在有個問題,不知道怎麼用PHP去擷取這個資料,我用$_POST["data"]擷取到的是空的,直接print_r($_POST)也沒有得到資料,請問如何通過PHP擷取資料?
------解決方案--------------------
由於你沒告訴我們你的 Simple.Ajax 是如何寫的,那麼也只能從原理上說一下
1、如果使用 post 方式發送,那麼必須有 Content-Type = application/x-www-form-urlencoded 的聲明
否則 php 不會將出傳入的資料解析到 $_POST 數組
你發了一個 contentType = application/json 的聲明,即便你的 Simple.Ajax 會自動補上一個 Content-Type = application/x-www-form-urlencoded 的聲明。這兩個相佐的聲明也會使 php 無所適從
2、你發送的資料是 {data:jsonData},這是一個 js 對象。即使能夠發送成功,php 也會因為不認識這個對象,而無法解析。凡是與外界進行交換的資料結構,都需要按雙方約定的格式序列化成字串
假定你的 Simple.Ajax 可以將 js 的對象轉換成 JSON 格式串
並且你也去掉了 contentType = application/json 的聲明
那麼你在 $_POST 中可以看到以那個 JSON串為鍵的元素
如果你堅持不願意去掉 contentType = application/json 的聲明
或許你個用 file_get_contents('php://input') 取到傳入的內容
------解決方案--------------------
如果有 Content-Type=application/json 聲明,$_POST 是不會有資料的
------解決方案--------------------
file_get_contents('php://input')
但不保證能成功
application/json 只是伺服器給使用者用的,告訴使用者:你可把內容解釋成一個 json 對象
就好比 image/png 是說這是一個 png 圖片一樣
而使用者向伺服器發送資料時,只有
application/x-www-form-urlencoded
multipart/form-data
text/plain
三種聲明