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 相关文章推荐
JS实现打开本地文件或文件夹
Mar 09 Javascript
JavaScript中“+=”的应用
Feb 02 Javascript
用js实现的检测浏览器和系统的函数
Apr 09 Javascript
JS:window.onload的使用介绍
Nov 13 Javascript
转换字符串为json对象的方法详解
Nov 29 Javascript
thinkphp 表名 大小写 窍门
Feb 01 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
Aug 22 Javascript
js拼接html字符串的注意事项
Oct 13 Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
Apr 12 Javascript
vue项目强制清除页面缓存的例子
Nov 06 Javascript
Layui表格监听行单双击事件讲解
Nov 14 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将时间差转换为字符串提示
2011/09/07 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
常用DOM整理
2015/06/16 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python实现常见的回文字符串算法
2018/11/14 Python
详解python深浅拷贝区别
2019/06/24 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
Python如何绘制日历图和热力图
2020/08/07 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
通信工程专业女生个人求职信
2013/09/21 职场文书
航空大学应届生求职信
2013/11/10 职场文书
小小商店教学反思
2014/04/27 职场文书
端午节演讲稿
2014/05/23 职场文书
保密工作整改报告
2014/11/06 职场文书
班主任寄语2015
2015/02/26 职场文书
暂住证证明
2015/06/19 职场文书
给学校的建议书400字
2015/09/14 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python