Как вернуть HTML-страницу из RestController весной?

#java #html #spring #spring-boot #rest

Вопрос:

Я изучаю веб-сервисы Spring и Rest, так что это немного сбивает меня с толку. Это мой класс:

 RestController
@RequestMapping("/app-api/users")
public class UserApiController {

 @Autowired
 UserRepository userRepo;

 @GetMapping
 public Iterable<User> getUsers(){
    return userRepo.findAll();
  }   
}
 

Теперь, когда я тестирую этот GET запрос в каком-либо клиенте rest, я получаю HTTP status 200 и всех пользователей в JSON формате. Но как я могу их отобразить HTML ? Я попробовал это как обычный контроллер:

 @GetMapping("/test")
public String getUsers(Model model) {
    Iterable<User> users = userRepo.findAll();
    model.addAttribute("users", users);

    return "test-user";
}
 

Но это не работает, так как он просто возвращается test-user в виде обычного текста. Мой вопрос в том, каков правильный способ и соглашение для обработки данных RestController и их отображения в html?

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

1. Вам нужно будет вернуть полный HTML-документ и установить тип носителя в text/html ( @GetMapping("/test", produces = javax.ws.rs.core.MediaType.TEXT_HTML) )

2. @Turing85 я получаю ошибку 404.

3. Передаете ли вы правильные параметры методу getUsers(режим модели)? Вы обращаетесь к правильному URL-адресу(app-api/пользователи/тест)? Вы столкнулись с ошибкой 404 в браузере или restclient?

Ответ №1:

Веб-службы Spring обычно используются для представления API, предоставляющего необработанные данные для использования автономными приложениями (например, angular, мобильным приложением), поначалу это может сбить с толку.

Если вы хотите, чтобы ваше приложение предоставляло HTML-страницу, я рекомендую вам взглянуть на ThymeLeaf, я думаю, есть и другие способы сделать то же самое, но это единственный, который я знаю. Надеюсь, это поможет, хорошего дня !

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

1. У меня есть Thymeleaf в моем проекте, но я все еще получаю ошибку. Что мне делать?

Ответ №2:

Ваш

 @GetMapping("/test")
public String getUsers(Model model) {
  model.addAttribute("users", userRepo.findAll());
  return "test-user";
}
 

следует перейти в @Controller аннотированный класс (не @RestController).

И

 @GetMapping
public Iterable<User> getUsers(){
  return userRepo.findAll();
}   
 

в другой @RestController класс.

Это два разных подхода.
Вы используете @Controller для формирования HTML-страницы на стороне сервера с помощью одного из движков шаблонов (например, упомянутого Thymeleaf).
В то время как @RestController предназначен для конечной точки API. Обычно вы используете javascript для выполнения запроса ajax и формирования HTML на стороне клиента.

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

1. Спасибо за ответ, так ли разработчики обычно обращаются с контроллерами rest? Чтобы сформировать HTML-страницу, мы должны сделать ajax-запрос на стороне клиента?

2. Контроллеры Rest предназначены для API, где P означает программирование. Вам нужна какая-то программа для запроса контроллеров rest. Это может быть javascript ajax (обычно для создания html) или любая другая программа. Вы можете использовать один из двух подходов или смесь обоих. Использование контроллеров rest и некоторых библиотек/фреймворков js, таких как React.js это более продвинутая техника, но для простых вещей можно использовать обычные контроллеры и рендеринг на стороне сервера.