解决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 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
javascript模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
页面载入结束自动调用js函数示例
Sep 23 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
node.js中的fs.lchown方法使用说明
Dec 16 Javascript
JavaScript时间转换处理函数
Apr 14 Javascript
AngularJS中的过滤器filter用法完全解析
Apr 22 Javascript
js实现登录验证码
Dec 22 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
May 25 jQuery
vue将时间戳转换成自定义时间格式的方法
Mar 02 Javascript
Vue利用History记录上一页面的数据方法实例
Nov 02 Javascript
JavaScript装饰者模式原理与用法实例详解
Mar 09 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和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
PHP如何实现跨域
2016/05/30 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python去掉字符串中空格的方法
2014/03/11 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
解析Python的缩进规则的使用
2019/01/16 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
python代码中怎么换行
2020/06/17 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
创先争优承诺书范文
2014/03/31 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android