溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

AngularJs的$http發(fā)送POST請(qǐng)求,php無法接收Post的數(shù)據(jù)怎么辦

發(fā)布時(shí)間:2020-08-13 11:43:31 來源:億速云 閱讀:188 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下AngularJs的$http發(fā)送POST請(qǐng)求,php無法接收Post的數(shù)據(jù)怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

最近在使用AngularJs+Php開發(fā)中遇到php后臺(tái)無法接收到來自AngularJs的數(shù)據(jù),在網(wǎng)上也有許多解決方法,卻都點(diǎn)到即止.多番摸索后記錄下解決方法:

tips:當(dāng)前使用的AngularJs版本為v1.5.0-rc.0

原因分析:

在使用jquery的時(shí)候進(jìn)行post請(qǐng)求的時(shí)候很簡(jiǎn)單.

$.ajax({
 type: 'POST',
 url:'process.php',
 data: formData,
 dataType: 'json',
 success: function(result){
  //do something
 }
 });

對(duì)這個(gè)傳輸?shù)臄?shù)據(jù)我們一般會(huì)直接使用serialize()或使用serializeArray()處理后再傳輸,但在發(fā)送post請(qǐng)求時(shí)jquery會(huì)把這個(gè)對(duì)象轉(zhuǎn)換為字符串后再發(fā)送,類似"a=123&b=456".
而AngularJs傳輸?shù)氖且粋€(gè)Json數(shù)據(jù)而不是一個(gè)轉(zhuǎn)換后的字符串,在php端接收的時(shí)候不能直接使用$_POST方式接收.這樣是獲取不到數(shù)據(jù)的.
$POST方式只能接收Content-Type: application/x-www-form-urlencoded提交的數(shù)據(jù),也就是表單提交的數(shù)據(jù).
但可以使用file_get_contents("php://input")接收,對(duì)于沒有沒有指定Content-Type的Post數(shù)據(jù)也是可以接收到的,此時(shí)獲取到的是個(gè)字符串還需要再轉(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 &#63; 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]' &#63; param(data) : data;
 }];
});
$http({
 method:"POST",
 url:"/api/login.php",
 data:$scope.Account
});

補(bǔ):

php獲取時(shí)也可通過$GLOBALS['HTTP_RAW_POST_DATA']獲取POST提交的原始數(shù)據(jù).
但$GLOBALS['HTTP_RAW_POST_DATA']中是否保存POST過來的數(shù)據(jù)取決于centent-Type的設(shè)置,即POST數(shù)據(jù)時(shí) 必須顯式示指明Content-Type: application/x-www-form-urlencoded,POST的數(shù)據(jù)才會(huì)存放到 $GLOBALS['HTTP_RAW_POST_DATA']中.

以上是AngularJs的$http發(fā)送POST請(qǐng)求,php無法接收Post的數(shù)據(jù)怎么辦的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI