解决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 相关文章推荐
gridpanel动态加载数据的实例代码
Jul 18 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
Jun 19 Javascript
css与javascript跨浏览器兼容性总结
Sep 15 Javascript
jquery中radio checked问题
Mar 16 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
Apr 18 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
Dec 06 Javascript
JavaScript实现星星等级评价功能
Mar 22 Javascript
微信小程序使用form表单获取输入框数据的实例代码
May 17 Javascript
JS面向对象的程序设计相关知识小结
May 26 Javascript
vue生命周期和react生命周期对比【推荐】
Sep 19 Javascript
vue实现购物车案例
May 30 Javascript
JS中如何优雅的使用async await详解
Oct 05 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
快速开发一个PHP扩展图文教程
2008/12/12 PHP
php 函数使用方法与函数定义方法
2010/05/09 PHP
使用php 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
python中pygame模块用法实例
2014/10/09 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
利用python爬取有道词典的方法
2020/12/08 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
财务会计毕业生个人求职信
2014/02/03 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
公司股权转让协议书
2014/04/12 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
小学生差生评语
2014/12/29 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
Java数据结构之堆(优先队列)
2022/05/20 Java/Android
MySQL数据库表约束讲解
2022/06/21 MySQL