如何在Rest Get调用中将Java日期作为路径变量传递

时间:2018-06-27 22:12:15

标签: java date http spring-boot get

现有的api具有以下代码:

@GetMapping(value = "/getAmount")
public long getAmount(){

    Date d = new Date();
    long amountFetchedFromDb = callToDatabase(d);
    return amountFetchedFromDb;
}

现在我需要按以下方式更改功能:

@GetMapping(value = "/getAmount")
public long getAmount(){

    Date d = new Date();
    <CALL TO A NEW  REST API PASSING IT THE DATE d AND THE NEW API 
     WILL MAKE THE DB CALL AND RETURN THE AMOUNT>
    return amount;
}

现在,我创建了一个新的rest服务,该服务将java日期作为路径变量,如下所示:

@GetMapping("/getAmount/{dateTo}")
public long getAmount(@PathVariable Date dateTo){

   long amountFetchedFromDb = callToDatabase(d);
   return amountFetchedFromDb;
}

现在我需要测试我的新服务。如何在以下请求中传递日期:

http://localhost:8080/getAmount/

现有api中没有使用日期格式。它只是创建一个Java日期并将查询传递给Db。没有转换。因此,我不确定它将传递给我什么。因此,我做了一个简单的rest服务,该服务返回新的Date()。当我运行它时,我得到响应1530137142067(今天是6月27日)。这是什么格式?

我希望这不要太令人困惑。如果我的查询不清楚,请告诉我。

3 个答案:

答案 0 :(得分:2)

有两种方法可以实现这一目标。

传递简单的String日期作为路径变量。然后使用SimpleDateFormatString解析为一个日期对象。请注意,以这种方式您将要处理可能失败的转换。您的客户还应该知道他们将使用的日期格式。我认为这不是最好的方法,但是可行的。

传入定义一个纪元的数字,并使用它来构造您的日期对象。假设您对非常好的精度(纳秒等)不感兴趣,那么您应该没事。

因此,在第一个选项的情况下,您的get请求将如下所示:

someurl/getAmount/28-06-2018/

第二次:

someurl/getAmount/1530137142067

我认为后者是最好的。

答案 1 :(得分:0)

1530137142067是自Unix时代以来的毫秒数。

示例

$ date
Wed, Jun 27, 2018  3:28:30 PM
$ date +%s
1530138468

+%s选项要求date命令返回自纪元以来的 seconds 。如果将值格式设置为1530137142.067,则可以看到它与我的系统显示的内容非常接近。

这可能是传输时间戳作为参数 的“最佳”(最便携)方式,只要两端都同意时区 date +%s命令返回的值以UTC为单位。为了获得最大的可移植性,您应该在所有地方使用UTC并仅在输出时转换为本地时区。内部,一切都应该是UTC。

答案 2 :(得分:0)

如果要使用PathVariable,可以使用以下示例方法:

//You can consume the path .../getAmount/2019-04-25
@GetMapping("/getAmount/{dateTo}")
public long getAmount(@PathVariable("dateTo") @DateTimeFormat(pattern = "yyyy-MM-dd") Date dateTo) {
    long amountFetchedFromDb = callToDatabase(dateTo);
    return amountFetchedFromDb;
}