解决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 相关文章推荐
用js 让图片在 div或dl里 居中,底部对齐
Jan 21 Javascript
JS获取IP、MAC和主机名的五种方法
Nov 14 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
javascript等号运算符使用详解
Apr 16 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
Aug 10 Javascript
Vue.js在数组中插入重复数据的实现代码
Nov 17 Javascript
js中getter和setter用法实例分析
Aug 14 Javascript
对vue中v-on绑定自定事件的实例讲解
Sep 06 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
小程序实现投票进度条
Nov 20 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
Jul 18 Javascript
vue postcss-px2rem 自适应布局
May 15 Vue.js
解决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中的Cannot modify header information 问题
2013/08/12 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
Git命令之分支详解
2021/03/02 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
node.js环境搭建图文详解
2018/09/19 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
深入浅析python继承问题
2016/05/29 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python3 flask实现文件上传功能
2020/03/20 Python
Django中create和save方法的不同
2019/08/13 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
Python基于Faker假数据构造库
2020/11/30 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
夫妻双方自愿离婚协议书
2014/10/24 职场文书
护士年终个人总结
2015/02/13 职场文书
新郎新娘致辞
2015/07/31 职场文书
Java获取字符串编码格式实现思路
2022/09/23 Java/Android