ajax不管是post還是get傳遞數據的時候是什么樣的形式傳遞數據呢?
如果我們用curl來模擬ajax來發送數據時候,我們構造的$data應該是怎樣才是標準的呢?
1、首先最容易想到的是數組結果如$data=array('a'=>1,'b'=>2);
2、還會想到json數據格式如$data=json_encode(array('a'=>1,'b'=>2));
這上面的兩個方式在接收端作了限制后都是不正確的。(大多數數據接口的方式);
標準的傳遞數據格式是:a=1&b=2
1.接收數據流
function getRawData(){
$put = array();
parse_str(file_get_contents('php://input'), $put);
return $put;
}
//實用函數
/* 獲取與發送數據
* $url 獲取路地址
* $postData傳遞數據數組形式
* $isDebug 是否調試打印發送地址和發送數組
* return 返回如果是字符則是字串,json格式則返回數組
*/
function curlHttp($url,$postData,$isDebug=false){
$url=strstr($url,'http:')?$url:C('HTTPURL').$url;
if($isDebug){dump($url);dump($postData);}//調試則輸出發送的地址和發送的數據串
$ch=curl_init();// 初始化
//$header = array('Expect:');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//將curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。
curl_setopt($ch, CURLOPT_HEADER, 0);//是否取得頭信息
curl_setopt($ch, CURLOPT_POST, true);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));//http_build_query自動構造url發送信息
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);//20秒連接超時
//curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$data=curl_exec($ch);
$toArray=json_decode($data,true);
if(is_array($toArray)){
$data=listToArray($toArray);
}
return $data;
}
/* 對curlHttp返回的list一維數組的如果含json串轉為深度轉換數組
* $data一維數組,鍵值含有json字符串
* return 返回一個標準的數組
* */
function listToArray($data){
$arr=array();
foreach($data as $k=>$v){
if(is_json($v)){
$arr[$k]=listToArray(json_decode($v,true));
}elseif(is_array($v)){
$arr[$k]=listToArray($v);
}else{
$arr[$k]=$v;
}
}
return $arr;
}
/* 判斷數據是否為json數據 備注:json_decode對于數組和數字也會判定為json數據需要加上{的判定
* $string字符串
* return 返回true or false
* */
function is_json($string) {
$isjsonf=json_decode($string);
$isjsont=strstr($string,'{');
return ($isjsonf && $isjsont)?true:false;
}
前端ajax獲取數據

<script>
$.ajax({
url:"api接口地址",
type:'POST',//參數方式
dataType: "json",//數據類型
data:{"action":1,"OrderID":"112-2316089-0269002","MD5Key": "55E9D105D116DBEC3E8285EB0F5C6404"'},
success:function (val) {
console.log(val);
},error:function(){
alert('error');
}
})