angular js $post,$get請求傳值


困擾了我好幾天的問題!!!

剛開始學play框架,在向后台傳值時,一直不成功!

當你用$POST傳遞一個參數時:

HTML:

<button ng-click=test()>測試</button>

JS:

  $scope.test = function() {

    $http({
      method: 'POST',
      url: '/Application/jump',
      data:{name:"zby"},
    }).then(function successCallback(response) {
      // 請求成功執行代碼
      }, function errorCallback(response) {
    // 請求失敗執行代碼
    });

  }

我的后台控制器方法:

  public static void test(String name) {
    System.out.println(name);

    System.out.println(params.get("name"));

  }

這樣傳到后台的值為NULL,NULL。

我把JS換成:

  $scope.test = function() {
    $http({
      method: 'POST',
      url: '/Application/test',
      params: {name:"zby"},
    }).then(function successCallback(response) {
      // 請求成功執行代碼
    }, function errorCallback(response) {
      // 請求失敗執行代碼
    });
  }

后台控制器方法不變。

傳到后台的值為zby,zby。

同理傳遞多個參數也能成功,只要把JS里的params與后台控制器的test的參數改成多個就行,但是兩個參數名字,個數必須一致。

還有一種方法則是把傳遞的值直接寫入URL里,把JS改成

  $scope.test = function() {
    var name = "zby";
    $http({
      method: 'POST',
      url: '/Application/test?name=' + name,
    }).then(function successCallback(response) {
      // 請求成功執行代碼
    }, function errorCallback(response) {
      // 請求失敗執行代碼
    });
  }

后台控制器方法不變,照樣能接收到后台傳來的值。

接下來看看$get方法傳值:

①方法傳到后台的值與$post一樣為NULL,NULL。

②方法傳到后台的值與$post一樣為zby,zby。

③方法傳到后台的值與$post一樣為zby,zby。

所以能看出來這三種方法$post,$get傳值都一樣。

接下來我們看看第四種方法

  $scope.test = function() {
    $http({
      method: 'POST',
      url: '/Application/test',
      data: {name: "zby"},
      headers:{'Content-Type': 'application/x-www-form-urlencoded'},
      transformRequest: function(obj) {
        var str = [];
        for(var p in obj) {
          str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
        }
        return str.join("&");
      }
    }).then(function successCallback(response) {
      // 請求成功執行代碼
    }, function errorCallback(response) {
      // 請求失敗執行代碼
    });
  }

后台控制器方法不變,傳遞到后台的值為zby,zby。

那么我們看看這種方法GET請求行不行,將JS里的method改為method: 'GET',傳遞到后台的值為NULL,NULL。

$get請求並不能用這種方法傳遞,而$post確可以。這是為什么呢?

來看看這四種方法的request請求到底發了啥數據過來

第①種:

$post

$get

第②種:

$post

$get

第③種:

$post

$get

第④種:

$post:

$get:

通過測試可知,

在第②種方法與第③種方法中,$post與$get請求都能夠向后台傳值,並且通過圖的比較可知都是通過Query String Parameters傳值

在第①種方法中,$post與$get請求不能向后台傳值,但是$post請求的圖中多出了

在第④種方法中,$get請求不能向后台傳值,而$post請求能向后台傳值,並且第①種與第④種的區別在於第④種方法添加了如下代碼:

      headers:{'Content-Type': 'application/x-www-form-urlencoded'}, 
      transformRequest: function(obj) { 
        var str = []; 
        for(var p in obj) { 
          str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
        } 
        return str.join("&"); 
      } 

為什么加了這段代碼$post請求就可以傳值成功了呢?

我們看看兩種的區別:

①:

④:

可以發現AngularJs用post 提交數據 以 json 格式提交的,而平時我們jquery post 提交數據是以 form-data 的形式提交的,只有把它轉化為form-data形式后台才能接收到。

解決方法就是:改AngularJs 提交數據的方式,配置 header 值,使用 transformRequest對提交數據進行序列化,把 json 對象更改為字符串。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM