欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-23 22:00:47
写此文的背景:在学习使用angular的$http.post()提交数据时,后台接收不到参数值,于是查阅了相关资料,寻找解决办法。 写此文的目的:通过上面提到的文章中的解...

写此文的背景:在学习使用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提交问题。