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 相关文章推荐
JQuery 遮罩层实现(mask)实现代码
Jan 09 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
JavaScript表格常用操作方法汇总
Apr 15 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
JavaScript实现算术平方根算法-代码超简单
Sep 11 Javascript
基于javascript制作经典传统的拼图游戏
Mar 22 Javascript
jquery Form轻松实现文件上传
May 24 jQuery
vue+Java后端进行调试时解决跨域问题的方式
Oct 19 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
Nov 17 Javascript
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 Javascript
微信小程序实现渐入渐出动画效果
Jun 13 Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 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中的时间显示
2007/01/18 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
2007/03/27 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
JS重载实现方法分析
2016/12/16 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
Python中format()格式输出全解
2019/04/12 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
Python unittest框架操作实例解析
2020/04/13 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
什么是Smart Navigation?
2016/07/03 面试题
大学生求职信范文应怎么写
2014/01/01 职场文书
新闻编辑求职信
2014/07/13 职场文书
地震捐款倡议书
2014/08/29 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
2015年人事科工作总结
2015/04/28 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
紫日观后感
2015/06/05 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
创业计划书之酒店
2019/08/30 职场文书
分享几个实用的CSS代码块
2022/06/10 HTML / CSS