解决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 相关文章推荐
Javascript setInterval的两种调用方法(实例讲解)
Nov 29 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
Jan 29 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
Aug 08 Javascript
vuejs动态组件给子组件传递数据的方法详解
Sep 09 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
vue watch自动检测数据变化实时渲染的方法
Jan 16 Javascript
vue 项目地址去掉 #的方法
Oct 20 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
Dec 03 Javascript
vue项目中使用vue-i18n报错的解决方法
Jan 13 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
Apr 17 Javascript
微信小程序云开发之新手环境配置
May 16 Javascript
JavaScript Canvas编写炫彩的网页时钟
Oct 16 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/03/18 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
纯php生成随机密码
2015/10/30 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
js substr、substring和slice使用说明小记
2011/09/15 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
jquery实现动态画圆
2014/12/04 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
Python实现批量检测HTTP服务的状态
2016/10/27 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python感知机实现代码
2019/01/18 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
财务会计专业自荐书
2014/06/30 职场文书
世界文化遗产导游词
2015/02/13 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
Django框架中表单的用法
2022/06/10 Python