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 相关文章推荐
IE8 引入跨站数据获取功能说明
Jul 22 Javascript
javascript中的new使用
Mar 20 Javascript
javascript中this做事件参数相关问题解答
Mar 17 Javascript
document节点对象的获取方式示例介绍
Dec 24 Javascript
jQuery siblings()用法实例详解
Apr 26 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
May 03 Javascript
JS使用正则表达式验证身份证号码
Jun 23 Javascript
AngularJs+Bootstrap实现漂亮的计算器
Aug 10 Javascript
基于Vue实现图书管理功能
Oct 17 Javascript
vue v-for直接循环数字实例
Nov 07 Javascript
前端开发基础javaScript的六大作用
Aug 06 Javascript
PHP 502bad gateway原因及解决方案
Nov 13 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获取服务器时间的实现代码
2013/06/07 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Django的models中on_delete参数详解
2019/07/16 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
招股说明书范本
2014/05/06 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
公司会议开幕词
2015/01/29 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android