Как написать соответствующую конечную точку в Spring Boot для запроса GET?

#spring-boot #rest #get

#spring-boot #rest #получить

Вопрос:

У меня есть задание написать простой запрос GET.

Формат, который будет введен в URL, выглядит следующим образом:

 http://localhost:8080/api/tasks/20-08-2020
  

Сервер должен вернуть TODOs на эту дату. Мне удалось написать метод finder. Но не уверен, как написать конечную точку. Это то, что у меня есть на данный момент:

 @GetMapping(value = "/{date}", consumes="application/json")
public ResponseEntity<List<Task>> getTasksByDateUsingURL(@PathVariable("date") @DateTimeFormat(pattern="dd-MM-yyyy") @Valid LocalDate dueDate){
    
    List<Task> tasks = taskService.getAllTasksByDate(dueDate);
    return  new ResponseEntity<List<Task>>(tasks,HttpStatus.OK);
}
  

Это внутри RestController класса:

 @RestController
@RequestMapping(value="/api/tasks")
public class TaskController {...}
  

Я не могу попасть в эту конечную точку GET…

Комментарии:

1. Попробуйте значение=»/api /tasks». Вы пропустили косую черту.

2. @Suman Я отредактировал. По-прежнему безуспешно. Я думал, возможно, написать регулярное выражение для дд-мм-гггг. Но также не уверен. Я тестирую прямо сейчас…

3. Пожалуйста, поделитесь командой и выводом GET api.

4. Попробуйте избавиться от потребления, если вы нажимаете из браузера. Потому что браузер по умолчанию добавляет «текст / html». Если вы не удаляете, попробуйте curl, добавив content-type как application / json.

5. @Suman Что вы подразумеваете под командой?

Ответ №1:

Обходной путь для вашей проблемы — получить строку в качестве параметра и проанализировать ее вручную

 @GetMapping(value = "/{date}", consumes="application/json")
public ResponseEntity<List<Task>> getTasksByDateUsingURL(
    @PathVariable("date") 
    String date
){
    LocalDate dueDate = parse(date);
    List<Task> tasks = taskService.getAllTasksByDate(dueDate);
    return  new ResponseEntity<List<Task>>(tasks,HttpStatus.OK);

}

private LocalDate parse(String stringDate) {
    // TODO
}
  

Комментарии:

1. Спасибо, Влад, не мог бы ты объяснить, почему моя первоначальная идея не работает? Я имею в виду, я установил atPathVariable и atDateTimeFormat . Почему я не нажимаю на конечную точку?

Ответ №2:

Как сказал автор в комментариях:

При попытке вызвать конечную точку из браузера сопоставление не выполняется.

Похоже, что браузер отправляет запрос с неправильным Content-Type заголовком. Для вашего сопоставления явно требуется только application/json значение.

При попытке вызвать конечную точку из Postman приложение возвращает статус 400.

Я не смог увидеть тело ответа, но я предполагаю, что проблема в @Valid аннотации к параметру. Как Spring должен проверять LocalDate ?

Итак, решение состоит в том, чтобы удалить consumes="application/json" из сопоставления или отправить соответствующее Content-Type значение и удалить @Valid аннотацию из параметра.