AngularJs的$http發(fā)送POST請求,php無法接收Post的數(shù)據(jù)問題及解決方案
最近在使用AngularJs+Php開發(fā)中遇到php后臺無法接收到來自AngularJs的數(shù)據(jù),在網(wǎng)上也有許多解決方法,卻都點(diǎn)到即止.多番摸索后記錄下解決方法:
tips:當(dāng)前使用的AngularJs版本為v1.5.0-rc.0
原因分析:
在使用jquery的時候進(jìn)行post請求的時候很簡單.
$.ajax({
type: 'POST',
url:'process.php',
data: formData,
dataType: 'json',
success: function(result){
//do something
}
});
對這個傳輸?shù)臄?shù)據(jù)我們一般會直接使用serialize()或使用serializeArray()處理后再傳輸,但在發(fā)送post請求時jquery會把這個對象轉(zhuǎn)換為字符串后再發(fā)送,類似"a=123&b=456".
而AngularJs傳輸?shù)氖且粋€Json數(shù)據(jù)而不是一個轉(zhuǎn)換后的字符串,在php端接收的時候不能直接使用$_POST方式接收.這樣是獲取不到數(shù)據(jù)的.
$POST方式只能接收Content-Type: application/x-www-form-urlencoded提交的數(shù)據(jù),也就是表單提交的數(shù)據(jù).
但可以使用file_get_contents("php://input")接收,對于沒有沒有指定Content-Type的Post數(shù)據(jù)也是可以接收到的,此時獲取到的是個字符串還需要再轉(zhuǎn)換才能變成我們想要的數(shù)據(jù)格式.這樣無疑增加了工作量.
解決方案:
1.引用JQuery,使用JQuery的$.param()方法序列化參數(shù)后傳遞
$http({
method : 'POST',
url: 'process.php',
data: $.param($scope.formData), //序列化參數(shù)
headers: { 'Content-Type': 'application/x-www-form-urlencoded' } )
})
2.使用file_get_contents("php://input")獲取再處理
$input = file_get_contents("php://input",true);
echo $input;
3.修改Angular的$httpProvider的默認(rèn)處理(參考:http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/)
// Your app's root module...
angular.module('MyModule', [], function($httpProvider) {
// Use x-www-form-urlencoded Content-Type
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
/**
* The workhorse; converts an object to x-www-form-urlencoded serialization.
* @param {Object} obj
* @return {String}
*/
var param = function(obj) {
var query = '', name, value, fullSubName, subName, subValue, innerObj, i;
for(name in obj) {
value = obj[name];
if(value instanceof Array) {
for(i=0; i<value.length; ++i) {
subValue = value[i];
fullSubName = name + '[' + i + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
}
else if(value instanceof Object) {
for(subName in value) {
subValue = value[subName];
fullSubName = name + '[' + subName + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
}
else if(value !== undefined && value !== null)
query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
}
return query.length ? query.substr(0, query.length - 1) : query;
};
// Override $http service's default transformRequest
$httpProvider.defaults.transformRequest = [function(data) {
return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
}];
});
$http({
method:"POST",
url:"/api/login.php",
data:$scope.Account
});
補(bǔ):
php獲取時也可通過$GLOBALS['HTTP_RAW_POST_DATA']獲取POST提交的原始數(shù)據(jù).
但$GLOBALS['HTTP_RAW_POST_DATA']中是否保存POST過來的數(shù)據(jù)取決于centent-Type的設(shè)置,即POST數(shù)據(jù)時 必須顯式示指明Content-Type: application/x-www-form-urlencoded,POST的數(shù)據(jù)才會存放到 $GLOBALS['HTTP_RAW_POST_DATA']中.
總結(jié)
到此這篇關(guān)于AngularJs的$http發(fā)送POST請求,php無法接收Post的數(shù)據(jù)解決方案的文章就介紹到這了,更多相關(guān)AngularJs的$http發(fā)送POST請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu系統(tǒng)下Angularjs開發(fā)環(huán)境安裝
本文主要介紹 Ubuntu系統(tǒng)下Angularjs開發(fā)環(huán)境安裝,這里詳細(xì)介紹了安裝步驟和注意事項(xiàng),有在Ubuntu 環(huán)境下開發(fā)的朋友可以參考下2016-09-09
Angular中使用$watch監(jiān)聽object屬性值的變化(詳解)
下面小編就為大家?guī)硪黄狝ngular中使用$watch監(jiān)聽object屬性值的變化(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Commands Queries設(shè)計模式提高Angular應(yīng)用性能及可維護(hù)性
在Angular應(yīng)用開發(fā)領(lǐng)域,Commands and Queries 設(shè)計模式是一個關(guān)鍵的概念,它有助于有效地管理應(yīng)用程序的狀態(tài)和與后端的交互,本文將深入探討這一設(shè)計模式的核心要點(diǎn),并通過實(shí)際示例來加以說明2023-10-10
如何使用AngularJs打造權(quán)限管理系統(tǒng)【簡易型】
這篇文章主要介紹了使用AngularJs打造權(quán)限管理系統(tǒng)【簡易型】的相關(guān)資料,需要的朋友可以參考下2016-05-05
MODULE_INITIALIZER初始化Angular?懶加載模塊高級技巧
這篇文章主要為大家介紹了MODULE_INITIALIZER初始化Angular懶加載模塊高級技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

