AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案


Posted in Javascript onAugust 13, 2020

最近在使用AngularJs+Php开发中遇到php后台无法接收到来自AngularJs的数据,在网上也有许多解决方法,却都点到即止.多番摸索后记录下解决方法:

tips:当前使用的AngularJs版本为v1.5.0-rc.0

原因分析:

在使用jquery的时候进行post请求的时候很简单.

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

对这个传输的数据我们一般会直接使用serialize()或使用serializeArray()处理后再传输,但在发送post请求时jquery会把这个对象转换为字符串后再发送,类似"a=123&b=456".
而AngularJs传输的是一个Json数据而不是一个转换后的字符串,在php端接收的时候不能直接使用$_POST方式接收.这样是获取不到数据的.
$POST方式只能接收Content-Type: application/x-www-form-urlencoded提交的数据,也就是表单提交的数据.
但可以使用file_get_contents("php://input")接收,对于没有没有指定Content-Type的Post数据也是可以接收到的,此时获取到的是个字符串还需要再转换才能变成我们想要的数据格式.这样无疑增加了工作量.

解决方案:

1.引用JQuery,使用JQuery的$.param()方法序列化参数后传递

$http({
 method : 'POST',
 url: 'process.php',
 data: $.param($scope.formData), //序列化参数
 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的默认处理(参考: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
});

补:

php获取时也可通过$GLOBALS['HTTP_RAW_POST_DATA']获取POST提交的原始数据.

$GLOBALS['HTTP_RAW_POST_DATA']中是否保存POST过来的数据取决于centent-Type的设置,即POST数据时 必须显式示指明Content-Type: application/x-www-form-urlencoded,POST的数据才会存放到 $GLOBALS['HTTP_RAW_POST_DATA']中.

总结

到此这篇关于AngularJs的$http发送POST请求,php无法接收Post的数据解决方案的文章就介绍到这了,更多相关AngularJs的$http发送POST请求内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript字符串插入、删除、替换函数使用示例
Jul 25 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
Dec 11 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
Javascript动画效果(2)
Oct 11 Javascript
深入理解vue.js双向绑定的实现原理
Dec 05 Javascript
Angular2的管道Pipe的使用方法
Nov 07 Javascript
基于JavaScript实现瀑布流布局
Aug 15 Javascript
使用Sonarqube扫描Javascript代码的示例
Dec 26 Javascript
jQuery实现的上拉刷新功能组件示例
May 01 jQuery
针对Vue路由history模式下Nginx后台配置操作
Oct 22 Javascript
js实现磁性吸附的示例
Oct 26 Javascript
解决Vue watch里调用方法的坑
Nov 07 Javascript
VsCode里的Vue模板的实现
Aug 12 #Javascript
typescript配置alias的详细步骤
Aug 12 #Javascript
js实现表格单列按字母排序
Aug 12 #Javascript
javascript的hashCode函数实现代码小结
Aug 11 #Javascript
vue axios封装httpjs,接口公用配置拦截操作
Aug 11 #Javascript
解决vue刷新页面以后丢失store的数据问题
Aug 11 #Javascript
封装 axios+promise通用请求函数操作
Aug 11 #Javascript
You might like
浅谈php的TS和NTS的区别
2019/03/13 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
javascript动画浅析
2012/08/30 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python的文件操作方法汇总
2017/11/10 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
python绘制条形图方法代码详解
2017/12/19 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
python轮询机制控制led实例
2020/05/03 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
详解python 内存优化
2020/08/17 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
银行业务授权委托书
2014/10/10 职场文书
质量负责人岗位职责
2015/02/15 职场文书
2015年派出所工作总结
2015/04/24 职场文书
医院合作意向书范本
2015/05/08 职场文书
详解Go与PHP的语法对比
2021/05/29 PHP
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技