接受对象列表的Java REST服务

时间:2016-08-15 15:12:34

标签: java spring rest

我必须编写一个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[]

3 个答案:

答案 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.ZonedDateTimeDateTime如果您使用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解析为你的对象。