#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
аннотацию из параметра.