解决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 相关文章推荐
关于Blog顶部的滚动导航条代码
Sep 25 Javascript
JS是否可以跨文件同时控制多个iframe页面的应用技巧
Dec 16 Javascript
nw.js实现类似微信的聊天软件
Mar 16 Javascript
javascript中caller和callee详解
Aug 10 Javascript
jquery实现超简洁的TAB选项卡效果代码
Aug 28 Javascript
如何利用AngularJS打造一款简单Web应用
Dec 05 Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 Javascript
angular中的cookie读写方法
Aug 02 Javascript
vue实现百度搜索功能
Dec 28 Javascript
微信公众号网页分享功能开发的示例代码
May 27 Javascript
小程序自动化测试的示例代码
Aug 11 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 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使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
xtree.js 代码
2007/03/13 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
python删除文件示例分享
2014/01/28 Python
在Python中关于中文编码问题的处理建议
2015/04/08 Python
九步学会Python装饰器
2015/05/09 Python
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
学雷锋标语
2014/06/25 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
公司聚餐通知
2015/04/22 职场文书
公司员工辞职信范文
2015/05/12 职场文书
生产实习心得体会范文
2016/01/22 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
详解SQL报错盲注
2022/07/23 SQL Server