全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

angular使用post、get向后台传参的问题实例

一、问题的来源

我们都知道向后台传参可以使用get、put,其形式就类似于name=jyy&id=001。但是在ng中我却发现使用$http post进行异步传输的过程中后台是接收不到数据的。其实这个问题是因为请求头的缘故。在ng中默认的请求头是:“Content-Type":"application/json",也就是说传递参数是使用的就是json格式。但是后台默认的却是Content-Type': 'application/x-www-form-urlencoded'。因此在这样的情况下后台接收到的数据就会是空的。

那么为什么使用get形式就可以传参呢?在书中我发现这样的一句话:”这个键的值是一个字符串map或对象,会被转换成查询字符串追加在URL后面。如果值不是字符串,会被JSON序列化”,可以理解为在get中参数的传递是直接追加在url后面的,那么此时参数形式{"id":"1","name":"jyy"}会被转化成id=1&name=jyy追加在url后面。那么在后台中就可以直接获取到了。例如:

var app = angular.module('app',[]);
    app.controller('ctrl',function($scope,$q,$http){
      var defer = $q.defer();
      var promise = defer.promise;
      $http({
        method: "get",
        params:{id:1,name:jyy},
        url:"1.php"
      }).success(function(data){
        defer.resolve(data);
      });
      promise.then(function(data){
        $scope.data = data;
      })
    })

在后台(PHP)输入echo $_GET[id]就可以正常显示了。

那么接下来就研究怎么解决post的传值了。

二、问题的解决

1. 修改请求头

第一种方法就是在ng中修改请求头将json格式改成x-www-form-urlencoded。修改方法点击即可查看。

值得注意的是,在使用第二种方法时,可以修改put,get,post,common的传参格式。因此修改哪种方式,就只能使用这种方式才能在后台得到参数。这篇博文写到使用common进行设置可以同时使用put、get、post进行传参。但是在我的实际操作中发现对common进行修改并不能使用post进行传参,而只有设置了post的请求头才可以。

另外由于在ng中的参数都是使用json格式表达,因此需要引入jquery,使用其$.param("参数列表的json格式")进行序列化表示。

首先使用修改post请求头。具体代码如下:

var app = angular.module('app');
  
    app.config(function($httpProvider){
      $httpProvider.defaults.headers.post = { 'Content-Type': 'application/x-www-form-urlencoded' }
    })
    app.controller('ctrl',function($scope,$resource,$q,$http){
      var defer = $q.defer();
      var promise = defer.promise;
      $http({
        method: "post",
        data:$.param({"id":"1","name":"jyy"}),
        url:"1.php"
      }).success(function(data){
        defer.resolve(data);
      });
      promise.then(function(data){
        $scope.data = data;
      })
    })

此时在后台中(使用的是php),输入echo $_POST[id],就会显示。而debug其中显示的请求头正是我们设置的。

2.在后台进行解决

由于使用的是php,所以暂时用php的方法解决。在这个方法中,我们不修改请求头。因为get传值是正常的,那么,只要能够得到post的值就好。既然ng向后台传值了,即便是因为请求头不同,但是总会传过来什么的吧,既然能够传过来,就先获取它。这个时候使用$GLOBALS['HTTP_RAW_POST_DATA']将这个传过来的东西显示出来。那么这个$GLOBALS['HTTP_RAW_POST_DATA']是什么呢?在网上查询得知$HTTP_RAW_POST_DATA 变量包含有原始的 POST 数据。此变量仅在碰到未识别 MIME 类型的数据时产生,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA。就是说现在这个请求头虽然是有冲突的,但是却能够显示出来。如下:

var app = angular.module('app',[]);
    app.controller('ctrl',function($scope,$q,$http){
      var defer = $q.defer();
      var promise = defer.promise;
      $http({
        method: "post",
        data:{'id':'1','name':'jyy'},
        url:"1.php"
      }).success(function(data){
        defer.resolve(data);
      });
      promise.then(function(data){
        $scope.data = data;
      })
    })

php代码:

echo $GLOBALS['HTTP_RAW_POST_DATA'];

此时显示出来的东西是:{"id":"1","name":"jyy"}。发现这个结果是正确显示了。那么直接对齐进行操作不就可以了?好吧,那就先看看是什么类型:使用gettype()得到的是string,就是说他是个json字符串。那就使用json_decode()转换,发现会报错。好吧,放弃使用这个方法。

但是此时还有另外的方法。使用file_get_contents("php://input"),这个方法中 php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 此时这个方法就可以返回传过来的参数了。代码如下:

$a = json_decode(file_get_contents("php://input"));
  echo $a->id;

结果输出正确的id。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持


# angularjs  # post  # 传参  # angular  # 参数  # get  # angularJS 发起$http.post和$http.get请求的实现方法  # 的是  # 就会  # 是因为  # 就可以  # 那就  # 好吧  # 种方法  # 都是  # 是一个  # 情况下  # 是个  # 序列化  # 但是在  # 在这个  # 是有  # 却是  # 就好  # 这个问题  # 不就  # 才可以 


相关文章: 建站上市公司网站建设方案与SEO优化服务定制指南  javascript中对象的定义、使用以及对象和原型链操作小结  家庭建站与云服务器建站,如何选择更优?  制作宣传网站的软件,小红书可以宣传网站吗?  如何选择高性价比服务器搭建个人网站?  如何快速搭建高效香港服务器网站?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  网站制作免费,什么网站能看正片电影?  b2c电商网站制作流程,b2c水平综合的电商平台?  小程序网站制作需要准备什么资料,如何制作小程序?  如何高效配置香港服务器实现快速建站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  C#如何使用XPathNavigator高效查询XML  制作国外网站的软件,国外有哪些比较优质的网站推荐?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何注册花生壳免费域名并搭建个人网站?  建站之星后台管理:高效配置与模板优化提升用户体验  如何快速重置建站主机并恢复默认配置?  建站之星下载版如何获取与安装?  如何在IIS中配置站点IP、端口及主机头?  如何快速搭建个人网站并优化SEO?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  常州企业网站制作公司,全国继续教育网怎么登录?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  宝塔面板创建网站无法访问?如何快速排查修复?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何通过商城自助建站源码实现零基础高效建站?  已有域名和空间如何快速搭建网站?  建站DNS解析失败?如何正确配置域名服务器?  山东云建站价格为何差异显著?  Thinkphp 中 distinct 的用法解析  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何续费美橙建站之星域名及服务?  如何通过WDCP绑定主域名及创建子域名站点?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何做网站制作流程,*游戏网站怎么搭建?  音乐网站服务器如何优化API响应速度?  如何在建站主机中优化服务器配置?  如何在云虚拟主机上快速搭建个人网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  建站10G流量真的够用吗?如何应对访问高峰?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  网站制作公司排行榜,抖音怎样做个人官方网站  建站之星如何开启自定义404页面避免用户流失?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何选择高效稳定的ISP建站解决方案?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。