我必须编写一个REST服务方法,该方法接受一个对象列表作为参数来计算某些东西并返回结果。
我到目前为止:
$('.counter').each(function() {
var $this = $(this),
countTo = $this.attr('data-count');
$({ countNum: $this.text()}).animate({
countNum: countTo
},
{
duration: 4000,
easing:'linear',
step: function() {
$this.text(Math.floor(this.countNum));
},
complete: function() {
$this.text(this.countNum);
}
});
});
但我确信@RequestMapping(value = "generateBill/{id}/{rates}")
public String generateBill(@PathVariable Long id, @PathVariable Rate rates[]) {
// do things
return "OK";
}
是错误的。
我也必须编写客户端部分,我也不知道该怎么做。这是我第一次编写这样的REST服务方法。
编辑:评分如下:
@PathVariable Rate rates[]
答案 0 :(得分:2)
您应该将对象放在POST
请求的正文中,而不是使用网址:
@RequestMapping(value = "generateBill/{id}", method = RequestMethod.POST)
public String generateBill(@PathVariable Long id, @RequestBody BillingRequest billingRequest) {
// do things
}
此外,直接映射有效负载中的集合是不可演化的(您无法在数组外添加新的“字段”),将数组包装在JSON对象中通常是一种很好的做法:
public class BillingRequest {
List<Rate> rates;
// Here you could add other fields in the future
}
您调用服务的HTTP请求如下所示:
POST / HTTP/1.1
{
"rates" : [
{
"version" : 1,
"amount" : 33.3,
"validFrom" : "2016-01-01",
"validUntil" : "2017-01-01"
},
{
"version" : 2,
"amount" : 10.0,
"validFrom" : "2016-02-01",
"validUntil" : "2016-10-01"
}
]
}
关于你的模型的最后一条建议:
java.time.LocalDate
(或jodatime)代替java.util.Date
。如果您需要日期+时间,请使用java.time.ZonedDateTime
(DateTime
如果您使用jodatime)java.math.BigDecimal
表示确切的数字。浮点数,例如Double
can lose precision 答案 1 :(得分:1)
第一个解决方案:
@RequestMapping(value = "generateBill/{id}/{rates}", method=RequestMethod.GET)
public String generateBill(@PathVariable Long id, @PathVariable Rate[] rates) {
// do things
return "OK";
}
或者第二个(更多Java风格;)):
@RequestMapping(value = "generateBill/{id}/{rates}", method=RequestMethod.GET)
public String generateBill(@PathVariable Long id, @PathVariable List<Rate> rates) {
// do things
return "OK";
}
你可以这样打电话:
获取: http://localhost:8080/public/generateBill/1/1,2,3,4
如果1.2,3,4替换为您的值,则取决于什么是Rate;)
修改强>
更新后,看起来您想拥有POST方法(您正在发布费率列表),然后这里已经回答了问题。 receiving json and deserializing as List of object at spring mvc controller
答案 2 :(得分:1)
其他解决方案是使用JSON String格式作为参数并在之后解析它。像
这样的东西 [
{
"rates":1,
"name":"rate1"
},
{
"rates":2,
"name":"rate2"
},
{
"rates":3,
"name":"rate3"
}
]
然后将json解析为你的对象。