困擾了我好幾天的問題!!!
剛開始學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 對象更改為字符串。