解决angular的post请求后SpringMVC后台接收不到参数值问题的方法


Posted in Javascript onDecember 10, 2015

这是我后台SpringMVC控制器接收isform参数的方法,只是简单的打出它的值:

@RequestMapping(method = RequestMethod.POST)
  @ResponseBody
  public Map<String, Object> save(
      @RequestParam(value = "isform", required = false) String isform) {
    System.out.println("isform value: " + isform);
    return null;
 
  }

前台页面发送一个post提交表单的请求

解决angular的post请求后SpringMVC后台接收不到参数值问题的方法

发现后台没有取到值

解决angular的post请求后SpringMVC后台接收不到参数值问题的方法

后边我想到的第一种方案是在控制器方法参数里加requestbody来接收json参数,改成如下:

@RequestMapping(method = RequestMethod.POST)
  @ResponseBody
  public Map<String, Object> save(
      @RequestParam(value = "isform", required = false) @RequestBody String isform) {
    System.out.println("isform value: " + isform);
    return null;
 
  }

但是isform的值结果还是为null,
接着我又对比了下以前的项目中,接收post请求的参数,发现一个有趣的现象,

下边是Angular的默认请求头:

$httpProvider.defaults.headers.post: (header defaults for POST requests)

Content-Type: application/json

$httpProvider.defaults.headers.put(header defaults for PUT requests)

Content-Type: application/json

其中Angular的post和put都是application/json,

而jquery的post请求的"Content-Type"默认为" application/x-www-form-urlencoded",于是我更改了angular的默认Content-Type,

app.config(function($httpProvider) {
  $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded';
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
 
});

接下来的请求body变成了这样,但是后边还是没有取到isform的值,

解决angular的post请求后SpringMVC后台接收不到参数值问题的方法

又查了半天,在一个老外的博客上发现了原因:
By default, jQuery transmits data using Content-Type: x-www-form-urlencoded and the familiar foo=bar&baz=moe serialization. AngularJS, however, transmits data using Content-Type: application/json and { "foo": "bar", "baz": "moe" } JSON serialization
自己翻译了:

默认情况下,jQuery传输数据使用Content-Type: x-www-form-urlencodedand和类似于"foo=bar&baz=moe"的序列,然而AngularJS,传输数据使用Content-Type: application/json和{ "foo": "bar", "baz": "moe" }这样的json序列。

所以下把Content-Type设置成x-www-form-urlencodedand之后,还需要转换序列的格式,

下边是我经过老外实践而自己测试过的最终方案:

app.config(function($httpProvider) {
  $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded';
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
 
  // Override $http service's default transformRequest
  $httpProvider.defaults.transformRequest = [function(data) {
    /**
     * The workhorse; converts an object to x-www-form-urlencoded serialization.
     * @param {Object} obj
     * @return {String}
     */
    var param = function(obj) {
      var query = '';
      var 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;
    };
 
    return angular.isObject(data) && String(data) !== '[object File]'
        ? param(data)
        : data;
  }];
});

在angular模块中添加以上代码,我们来看下效果:

解决angular的post请求后SpringMVC后台接收不到参数值问题的方法

发现与jquery的post请求风格一致了,有木有!!!

看下后台的参数接收情况,

 解决angular的post请求后SpringMVC后台接收不到参数值问题的方法

isform已经可以正常接收到参数了,大功告成!

以上就是angular的post请求后台接收参数为null的解决方案,希望对大家的学习有所帮助。

Javascript 相关文章推荐
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
Dec 31 Javascript
jquery图片放大镜功能的实例代码
Mar 26 Javascript
使用PHP+JQuery+Ajax分页的实现
Apr 23 Javascript
Javascript字符串浏览器兼容问题分析
Dec 01 Javascript
纯javascript判断查询日期是否为有效日期
Aug 24 Javascript
js全选按钮的实现方法
Nov 17 Javascript
JavaScript操作class和style样式代码详解
Feb 13 Javascript
jQuery用FormData实现文件上传的方法
Nov 21 Javascript
如何使用bootstrap框架 bootstrap入门必看!
Apr 13 Javascript
Vue源码学习之初始化模块init.js解析
Nov 02 Javascript
js变量值传到php过程详解 将php解析成数据
Jun 26 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
Jan 07 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
Dec 10 #Javascript
原生js实现数字字母混合验证码的简单实例
Dec 10 #Javascript
js实现新年倒计时效果
Dec 10 #Javascript
jquery判断复选框是否选中进行答题提示特效
Dec 10 #Javascript
jQuery实现选项卡切换效果简单演示
Dec 09 #Javascript
jquery特效 点击展示与隐藏全文
Dec 09 #Javascript
AngularJS实现表单手动验证和表单自动验证
Dec 09 #Javascript
You might like
php多文件上传实现代码
2014/02/20 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
PHP 实现缩略图
2021/03/09 PHP
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
js中的面向对象入门
2017/03/06 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python的randrange()方法使用教程
2015/05/15 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
Python图像读写方法对比
2020/11/16 Python
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
晚会邀请函范文
2014/01/24 职场文书
十佳美德少年事迹材料
2014/02/05 职场文书
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
营销团队口号
2014/06/06 职场文书
主要领导对照检查材料
2014/08/26 职场文书
个人催款函范文
2015/06/23 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书