Как передать дату Java в качестве переменной пути в вызове get rest - PullRequest
0 голосов
/ 28 июня 2018

Существует 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;
}

Теперь я создал новый сервис отдыха, который принимает в качестве переменной пути java-дату, как показано ниже:

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

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

Теперь мне нужно проверить мой новый сервис. Как передать дату в запросе ниже:

http://localhost:8080/getAmount/?

В существующем API нет формата даты. он просто создает Java-дату и передает запрос в Db. Нет конверсии. Итак, я не уверен, что это передаст мне. Итак, я создал простой сервис отдыха, который возвращает новый Date (). Когда я его запустил, я получил в ответ 1530137142067 (сегодня 27 июня). Какой это формат?

Надеюсь, это не слишком смущает. Пожалуйста, дайте мне знать, если мой запрос не ясен.

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Есть несколько способов добиться этого.

Передать простую String дату в качестве переменной пути. Затем используйте SimpleDateFormat для анализа String в объекте даты. Обратите внимание, что таким образом вы будете иметь дело с конверсией, которая может потерпеть неудачу. Также ваши клиенты должны знать формат даты, которую они будут использовать. Не самый лучший подход, на мой взгляд, но выполнимый.

Передайте число, определяющее эпоху, и используйте его для построения объекта даты. Предполагая, что вас не интересует очень высокая точность (наносекунды и т. Д.), Все будет в порядке.

Так что в случае первого варианта ваш запрос get будет выглядеть так:

someurl/getAmount/28-06-2018/

Для второго:

someurl/getAmount/1530137142067

На мой взгляд, последний является лучшим.

0 голосов
/ 26 апреля 2019

Если вы хотите использовать 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;
}
0 голосов
/ 28 июня 2018

Значение 1530137142067 - это количество миллисекунд с начала эпохи Unix.

Пример,

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

Опция +%s просит команду даты вернуть секунд с начала эпохи. Если вы отформатируете значение как 1530137142.067, вы увидите, что оно очень близко к тому, что отображала моя система.

Это, вероятно, "лучший" (наиболее переносимый) способ передачи метки времени в качестве параметра , если оба конца совпадают с часовым поясом . Значение, возвращаемое командой date +%s, указано в UTC. Для максимальной переносимости вы должны везде использовать UTC и конвертировать в местный часовой пояс только на выходе. Внутри все должно быть в формате UTC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...