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实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
vue2.0+webpack环境的构造过程
Nov 08 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
使用BootStrap实现标签切换原理解析
Mar 14 Javascript
基于bootstrop常用类总结(推荐)
Sep 11 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
Dec 06 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
JavaScript惰性求值的一种实现方法示例
Jan 11 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
vue实现移动端省市区选择
Sep 27 Javascript
mapboxgl实现带箭头轨迹线的代码
Jan 04 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
PHP4实际应用经验篇(9)
2006/10/09 PHP
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
Python通过select实现异步IO的方法
2015/06/04 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Python中bisect的用法及示例详解
2020/07/20 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
戴尔美国官网:Dell
2016/08/31 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
刊首寄语大全
2014/04/11 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
民主生活会汇报材料
2014/12/15 职场文书
参观邀请函范文
2015/02/02 职场文书
考勤制度通知
2015/04/25 职场文书
小学体育组工作总结
2015/08/13 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers