解决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 相关文章推荐
Bootstrap项目实战之子栏目资讯内容
Apr 25 Javascript
vue-router 学习快速入门
Mar 01 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 Javascript
vue的mixins属性详解
Mar 14 Javascript
layui弹出层按钮提交iframe表单的方法
Aug 20 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
Sep 19 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
Apr 07 Javascript
angular2 NgModel模块的具体使用方法
Apr 10 Javascript
微信小程序可滑动月日历组件使用详解
Oct 21 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 Javascript
浅谈JS的原型和原型链
Jun 04 Javascript
Vue组件化(ref,props, mixin,.插件)详解
May 15 Vue.js
原生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
解决中英文字符串长度问题函数
2007/01/16 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
use jscript Create a SQL Server database
2007/06/16 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
node.js中的console用法总结
2014/12/15 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
详解Node 定时器
2018/02/26 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
vue实现在线学生录入系统
2020/05/30 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
Python深入学习之上下文管理器
2014/08/31 Python
Python使用爬虫猜密码
2016/02/19 Python
python flask实现分页效果
2017/06/27 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
Python对象与引用的介绍
2019/01/24 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
毕业自荐信
2013/12/16 职场文书
大学学习生活感言
2014/01/18 职场文书
运动会四百米广播稿
2014/01/19 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
中学家长会邀请函
2014/02/03 职场文书
社团个人总结范文
2015/03/05 职场文书