问题描述
我试图创建的Java
接受两个列为 FORMDATA
参数的Web服务。
我已经使用了Angualr JS HTTP
服务作为this回答。
VAR queryRequest = $ HTTP({
方法:POST,
网址:服务/测试/ testPath',
数据:$参数({listA的:myList1,数组listB:myList2}),
标题:{内容类型:应用程序/ x-WWW的形式urlen codeD;字符集= UTF-8'}
});
我的对象 myList1
VAR myList1 = [];
变种物镜= {};
OBJ [VAL1] = 1
OBJ [val2的] = 2
myList1.push(OBJ);
我的对象 myList2
VAR myList2 = [];变种物镜= {};
OBJ [VAl11难] = 3
OBJ [val12] = 4
myList2.push(OBJ);变种物镜= {};
OBJ [VAl11难] = 5
OBJ [val12] = 6
myList2.push(OBJ);
我使用 javax.ws.rs。*
为休息服务
和我的Java服务器端点,它接受的数据,是AS-
@Path(testPath)
@POST
@Consumes(应用程序/ x-WWW的形式urlen codeD;字符集= UTF-8)
@Produces(应用/ JSON)
公共DataDTO addIssuancesForFP(@FormParam(为listA)列表<&类型A GT; list1的,@FormParam(数组listB)列表<&的TypeB GT;列表2){ 的System.out.println(服务正确调用);
返回service.getDTO(list1的,列表2);
}
我CLASSE类型A
私人整数VAL1;
私人整数val2的;
// getter和setter方法,以及默认的构造函数
我CLASSE的TypeB
私人整数VAl11难;
私人整数val12;
// getter和setter方法,以及默认的构造函数
端点被正确地打,但我在这两个列表中获得空
。请求结构是:
Accept:application/json, text/plain, */*
Content-Type:application/x-www-form-urlencoded;charset=UTF-8
listA[0][val1]:1
listA[0][val2]:2
listB[0][val11]:3
listB[0][val12]:4
listB[1][val11]:5
listB[1][val12]:6
It seems to be correct, I think mistake is in server part. How to resolve this?
Thanks
Note: This is just the mock data, which is in exact same format
Yeah so I don't think using form encoded data is going to work. The reason is that it is mainly for key value pairs, in the form
key1=value7&key2=value2&key3=value3...
What you are doing is using only two keys, listA
and listB
. So imagine what the values would need to look like, to send the entire list. It isn't pretty. For complex data, it is more viable to send the data in a format like JSON. The problem with this for your particular use case is that there are two unrelated objects (or arrays) to needs to send. For this, a solution would be to use multipart. You're in luck, because I just posted a late answer yesterday, on exactly how this can be handled with Angular.
I won't go through an explanation here about the code. Everything is explained in that link. Please read through it, as you go through this answer. I will be using Jersey as may JAX-RS implementation (as does the example in the link - but it also offers other alternative implementations)
Resource
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.glassfish.jersey.media.multipart.FormDataParam;
@Path("/form")
public class FormResource {
@POST
@Consumes("multipart/form-data")
@Produces("text/plain")
public String addIssuancesForFP(@FormDataParam("listA") List<TypeA> list1,
@FormDataParam("listB") List<TypeB> list2) {
StringBuilder response = new StringBuilder();
for(TypeA a: list1) {
response.append(a.toString()).append("; ");
}
for (TypeB b: list2) {
response.append(b.toString()).append("; ");
}
System.out.println("Service is called correctly");
return response.toString();
}
}
Angular
<!DOCTYPE html>
<html ng-app="formApp">
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="js/libs/jquery/jquery.js"></script>
<script src="js/libs/angular.js/angular.js"></script>
<script>
angular.module("formApp", [])
.controller("defaultCtrl", function($scope, $http) {
$scope.sendData = function() {
var myList1 = [];
var obj = {};
obj["val1"] = "value1";
obj["val2"] = "value2";
myList1.push(obj);
var myList2 = [];
var obj = {};
obj["val11"] = "value11";
obj["val12"] = "value12";
myList2.push(obj);
var obj = {};
obj["val11"] = "value211";
obj["val12"] = "value212";
myList2.push(obj);
var list1 = JSON.stringify(myList1);
var list2 = JSON.stringify(myList2);
var boundary = Math.random().toString().substr(2);
var header = "multipart/form-data; charset=utf-8; boundary=" + boundary;
$http({
url: "/api/form",
headers: {"Content-Type": header},
data: createRequest(list1, list2, boundary),
method: "POST"
}).then(function(response) {
$scope.result = response.data;
});
function createRequest(list1, list2, boundary) {
var multipart = "";
multipart += "--" + boundary
+ "\r\nContent-Disposition: form-data; name=listA"
+ "\r\nContent-type: application/json"
+ "\r\n\r\n" + list1 + "\r\n";
multipart += "--" + boundary
+ "\r\nContent-Disposition: form-data; name=listB"
+ "\r\nContent-type: application/json"
+ "\r\n\r\n" + list2 + "\r\n";
multipart += "--" + boundary + "--\r\n";
return multipart;
}
};
});
</script>
</head>
<body>
<div ng-controller="defaultCtrl">
<button ng-click="sendData()">Send</button>
<p>{{result}}
</div>
</body>
</html>
Result
TypeA{val1=value1, val2=value2};
TypeB{val1=value11, val2=value12};
TypeB{val1=value211, val2=value212};
Which is expected, as I just built a string from the toString()
methods, which I implemented in the TypeA
and TypeB
classes.
public class TypeA {
public String val1;
public String val2;
@Override
public String toString() {
return "TypeA{" + "val1=" + val1 + ", val2=" + val2 + '}';
}
}
public class TypeB {
public String val11;
public String val12;
@Override
public String toString() {
return "TypeB{" + "val1=" + val11 + ", val2=" + val12 + '}';
}
}
Hope this helps.
这篇关于麻烦发布数据作为JS角到Java REST Web服务表单数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!