Приложение для весенней загрузки как с передним концом, так и с успокаивающим

Я планирую создать веб-приложение, используя Spring Boot в качестве успокаивающего сервиса. мое веб-приложение для весенней загрузки должно быть доступно и для других приложений. В случае, если кто-либо обращается к остальной службе из другого приложения, мое приложение должно работать должным образом.

@Controller
public class GreetingController {
    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value="name", required=false,  defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting";
    }
}

В приведенном выше примере, если вызов осуществляется извне приложения, тогда остальная служба должна возвращать вывод JSON.

Один из способов выделить какую-то переменную как переменную запроса. Но я не хочу этого. Поделитесь пожалуйста каким-нибудь стандартным способом.

Ценю вашу помощь.

Каково именно ожидаемое поведение / приветствие в обоих случаях? Это одно и то же, но по-разному представлено?

Pawel Zieminski 13.09.2018 20:04
1
1
829
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Идиоматический способ - полагаться на заголовок запроса Accept. Если запрашивающий представляет Accept: application/json, верните ему данные JSON (REST API).

Если запрашивающий предоставит вам Accept: application/xhtml+xml, верните ему HTML (веб-интерфейс).

С точки зрения реализации вы должны использовать @RequestMapping с аргументом consumes. Вам нужно два метода. Если бизнес-логика для обоих путей одинакова, то его можно использовать повторно. Бизнес-логика должна находиться в другом методе или в отдельном @Service. Бизнес-логика сама по себе не должна знать, заботиться или полагаться на транспортный протокол (HTTP), сериализацию ответа на запрос или представление. Бизнес-логика должна работать только с POJO, а сериализацию оставить @Controller.

@Controller
@RequestMapping("/greeting")
public class GreetingController {

    @RequestMapping(consumes="application/json")
    @ResponseBody  //required if you want to return POJO (spring will serialize it to response body)
    public void rest() {
       //return POJO, it will be serialized to JSON. or serialize pojo 
       directly and return response with manually set body and headers.
    }

    @RequestMapping(consumes="application/xhtml+xml")
    public void html() {
            //populate model, return string pointing to HTML to View
    }

}

Я думаю, вы имеете в виду заголовок запроса Accept

Pawel Zieminski 13.09.2018 19:53

@PawelZieminski, конечно, ты прав. Я отредактировал ответ. Content-Type - это заголовок, возвращаемый этим ответом.

Bartosz Bilicki 13.09.2018 23:07

Я предлагаю создать два класса контроллеров, второй - с помощью @RestController. Тогда есть два пути; второй может быть «rs / welcome». Этот подход, разделяющий проблемы Интернета и RESTful, является гораздо более расширяемым и не требует каких-либо странных заголовков, с которыми большинство клиентов не хотят иметь дело.

Другие вопросы по теме