解决angular的$http.post()提交数据时后台接收不到参数值问题的方法


Posted in Javascript onDecember 10, 2015

写此文的背景:在学习使用angular的$http.post()提交数据时,后台接收不到参数值,于是查阅了相关资料,寻找解决办法。

写此文的目的:通过上面提到的文章中的解决之道,结合自己的经验,总结了如下发现。
前端:html,jquery,angular
后端:java,springmvc
一、平常使用的post提交和接收方式
前端使用jquery提交数据。

$.ajax({
  url:'/carlt/loginForm',
  method: 'POST',  
  data:{"name":"jquery","password":"pwd"},
  dataType:'json',
  success:function(data){
    //...
  }
});

后端java接收:

@Controller
public class UserController {
  @ResponseBody
  @RequestMapping(value="/loginForm",method=RequestMethod.POST)
  public User loginPost(User user){
    System.out.println("username:"+user.getName());
    System.out.println("password:"+user.getPassword());
    return user;
  }
}
model(不要忘记get、set方法):
public class User {
  private String name;
  private String password;
  private int age;
  
  //setter getter method

}

后台打印:

username:jquery
password:pwd

调用接口查看到的前端返回结果:

解决angular的$http.post()提交数据时后台接收不到参数值问题的方法

二、使用angularJs的post方法提交

<div ng-app="myApp" ng-controller="formCtrl">
 <form novalidate>
 UserName:<br>
 <input type="text" ng-model="user.username"><br>
 PassWord:<br>
 <input type="text" ng-model="user.pwd">
 <br><br>
 <button ng-click="login()">登录</button>
 </form>
</div>

js代码:

var app = angular.module('myApp', []);
app.controller('formCtrl', function($scope,$http) {
 $scope.login = function() {
  $http({
   url:'/carlt/loginForm',
   method: 'POST',   
   data: {name:'angular',password:'333',age:1}  
  }).success(function(){
   console.log("success!");
  }).error(function(){
   console.log("error");
  })
 };
});

后台打印结果:

username:null
password:null:

查看前端:

解决angular的$http.post()提交数据时后台接收不到参数值问题的方法

三、解决angular提交post问题。
相信看过上面提到的哪怕文章的人已经知道怎么解决问题了吧。文中是更改了angular的提交方式,使得angular的提交数据方式更像jquery的。

我试过,也是行得通的。然后我又试了另外一种方式。如下:

前端不变,依然是:

var app = angular.module('myApp', []);
app.controller('formCtrl', function($scope,$http) {
  $scope.login = function() {
    $http({
      url:'/carlt/loginForm',
      method: 'POST',      
      data: {name:'angular',password:'333',age:1}   
    }).success(function(){
      console.log("success!");
    }).error(function(){
      console.log("error");
    })
  };
});

后台变了,只是在User前加上@RequstBody,因为angular提交的是json对象:

@Controller
public class UserController {
  @ResponseBody
  @RequestMapping(value="/loginForm",method=RequestMethod.POST)
  public User loginPost(@RequestBody User user){
    System.out.println("username:"+user.getName());
    System.out.println("password:"+user.getPassword());
    return user;
  }
}
@RequestBody

作用:

      i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

      ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

    application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
    multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
    其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B) PUT方式提交时,根据request header Content-Type的值来判断:

    application/x-www-form-urlencoded, 必须;
    multipart/form-data, 不能处理;
    其他格式,必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;

四、解决了angular问题之后,发现jquery按照原来的方式提交post请求会报错(错误码415)。

如下方式可以解决jquery提交问题:

$.ajax({
  url:'/carlt/loginForm',
  method: 'POST',
  contentType:'application/json;charset=UTF-8',
  data:JSON.stringify({"name":"jquery","password":"pwd"}),
  dataType:'json',
  success:function(data){
    //...
  }
});

json对象转json字符串:JSON.stringify(jsonObj);

以上就是本文的全部内容,有兴趣的同学可以试试其它方法,希望本文可以解决大家遇到的angular的post提交问题。

Javascript 相关文章推荐
Mootools 1.2教程 函数
Sep 15 Javascript
js异常捕获方法介绍
Apr 10 Javascript
原生javascript实现图片按钮切换
Jan 12 Javascript
JavaScript实现的一个倒计时的类
Mar 12 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
Dec 03 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
Jun 08 Javascript
js removeChild 方法深入理解
Aug 16 Javascript
react 父组件与子组件之间的值传递的方法
Sep 14 Javascript
angular-tree-component的使用详解
Jul 30 Javascript
详解javascript中的Error对象
Apr 25 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
vue中移动端调取本地的复制的文本方式
Jul 18 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
js实现微信分享代码
Oct 11 #Javascript
You might like
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
PHP中session变量的销毁
2014/02/27 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
软件测试英文面试题
2012/10/14 面试题
自主招生自荐信怎么写
2015/03/24 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
详解php中流行的rpc框架
2021/05/29 PHP
Java8中Stream的一些神操作
2021/11/02 Java/Android
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技