小编典典

Spring Boot的JSON和HTML控制器

spring-boot

我正在编写一个应用程序,其中我需要对某些对象进行CRUD操作。我需要能够为人类用户提供HTML页面,并为其他应用程序提供JSON。现在,我的网址看起来像“阅读”:

GET  /foo/{id}      -> Serves HTML
GET  /rest/foo/{id} -> Serves JSON
etc.

这似乎有点多余。我宁愿有这样的事情:

GET /foo/{id}.html OR /foo/{id} -> Serves HTML
GET /foo/{id}.json              -> Serves JSON

Spring Boot可以做到吗?如果是这样,怎么办?

我知道如何返回JSON:

@RequestMapping(value = "/foo/{id}", method = RequestMethod.GET, produces = "application/json")
public Object fetch(@PathVariable Long id) {
    return ...;
}

我也知道如何返回HTML:

@RequestMapping("/app/{page}.html")
String index(@PathVariable String page) {
    if(page == null || page.equals(""))
        page = "index";
    return page;
}

但是我不确定如何让控制器根据请求执行一个或另一个。


阅读 340

收藏
2020-05-30

共1个答案

小编典典

这是Spring Boot的默认行为。唯一的是,您必须标记其中之一@RequestMapping才能生成JSON。例:

@Controller
class HelloController {

    // call http://<host>/hello.json
    @RequestMapping(value = "/hello", method = RequestMethod.GET, produces = "application/json")
    @ResponseBody
    public MyObject helloRest() {
        return new MyObject("hello world");
    }

    // call http://<host>/hello.html or just http://<host>/hello 
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String helloHtml(Model model) {
        model.addAttribute("myObject", new MyObject("helloWorld"));
        return "myView";
    }
}

有关更多信息,请访问:http : //spring.io/blog/2013/05/11/content-negotiation-using-spring-
mvc
http://spring.io/blog/2013/06/03/content-negotiation-
使用视图

2020-05-30