目录
什么是@RestController,什么是@Controller
使用@ResponseBody注解让方法返回值作为响应内容是什么意思
举例说明
@RestController
@Controller
什么时候需要返回的是视图,什么时候需要返回数据?
当设计 RESTful API 时,一般的原则是:
下面是一些示例情况:
再以实例说明,更通俗易懂的理解:
总结
什么是@RestController,什么是@Controller
@RestController
和 @Controller
是 Spring Framework 中用于定义控制器的注解。
@RestController
是一个组合注解,它结合了 @Controller
和 @ResponseBody
注解的功能(就相当于把两个注解组合在一起)。在使用 @RestController
注解标记的类中,每个方法的返回值都会以 JSON 或 XML 的形式直接写入 HTTP 响应体中,相当于在每个方法上都添加了 @ResponseBody
注解。
@Controller
注解标记的类则是传统的控制器类。它用于处理客户端发起的请求,并负责返回适当的视图(View)作为响应。在使用 @Controller
注解的类中,通常需要在方法上使用 @ResponseBody
注解来指示该方法的返回值要作为响应的主体内容,而不是解析为视图。
简而言之,@RestController
适用于构建 RESTful 风格的 API,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端。而 @Controller
适用于传统的 MVC 架构,它负责处理请求并返回相应的视图。(@RestController下的方法默认返回的是数据格式,@Controller注解标注的类下面的方法默认返回的就是以视图为格式)
在使用 @Controller
注解标记的类中,默认情况下,方法的返回值会被解析为一个视图名称,并寻找与该名称匹配的视图进行渲染。这意味着返回的结果会被解析为一个 HTML 页面或者模板引擎所需的数据。
但是有时候需要将方法的返回值直接作为响应的主体内容,而不是解析为视图。为了实现这个目的,我们可以在方法上使用 @ResponseBody
注解。
@ResponseBody
注解表示方法的返回值应该直接写入 HTTP 响应体中,而不是被解析为视图。它告诉 Spring MVC 框架将方法的返回值序列化为特定格式(如 JSON、XML 等)并作为响应的主体内容返回给客户端。
下面是一个使用 @Controller
和 @ResponseBody
的示例:
@Controller
@RequestMapping("/hello")
public class HelloController {
@GetMapping
@ResponseBody
public String sayHello() {
return "Hello, World!";
}
}
当客户端发起 /hello
的 GET 请求时,sayHello()
方法会返回一个字符串 "Hello, World!"。因为在方法上使用了 @ResponseBody
注解,返回值不会被解析为视图,而是直接作为响应的主体内容返回给客户端。
现在假设有一个简单的订单系统,其中有一个功能是获取订单信息。我们来看如何使用 @RestController
和 @Controller
分别实现同一个功能:
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{id}")
public Order getOrderById(@PathVariable int id) {
// 从数据库中获取订单信息
Order order = orderService.getOrderById(id);
return order;
}
}
使用 @RestController
注解标记类,并在方法上使用 @GetMapping
注解定义了一个 GET 请求的处理方法。方法的返回值是 Order
类型的对象,它将会直接序列化为 JSON 格式的数据,并作为 HTTP 响应的主体内容返回给客户端。
@Controller
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{id}")
@ResponseBody
public ModelAndView getOrderById(@PathVariable int id) {
// 从数据库中获取订单信息
Order order = orderService.getOrderById(id);
ModelAndView modelAndView = new ModelAndView("order-details");
modelAndView.addObject("order", order);
return modelAndView;
}
}
使用 @Controller
注解标记类,并在方法上使用 @GetMapping
注解定义了一个 GET 请求的处理方法。方法的返回值是 ModelAndView
类型的对象,它将包含要渲染的视图名称和需要传递给视图的数据。在方法上使用 @ResponseBody
注解,表示方法的返回值应该作为响应的主体内容,而不是解析为视图。
通俗一点说就是——有时候并不需要返回视图,只需要一组数据,这样在方法加上一个@ResponseBody,就可以让返回的格式转换为数据格式
@ResponseBody
注解)。需要返回视图的实例: 假设你正在开发一个博客应用的后端接口。有一个页面需要显示所有文章的列表,并且希望以 HTML 形式展示。在这种情况下,你可以设计一个 GET 请求的接口 /api/articles
,返回一个包含所有文章数据的视图,让前端直接展示这个页面。这里需要返回视图而不是仅返回数据,因为需要服务端渲染整个 HTML 页面。
只需要返回数据的实例: 假设正在开发一个电子商务网站,前端使用 React 或 Vue.js 等框架构建。在购物车页面上,需要获取当前用户的购物车数据以便展示。在这种情况下,你可以设计一个 GET 请求的接口 /api/cart
,返回一个 JSON 对象,包含当前用户的购物车数据。这里只需要返回数据而不是整个 HTML 页面,因为前端通过 JavaScript 来处理和展示数据。
@RestController
是 @Controller
和 @ResponseBody
的组合注解,用于创建 RESTful 风格的 API。@RestController
返回的数据会直接作为响应的主体内容(JSON 或 XML),不进行页面跳转或视图解析。@Controller
用于传统的 MVC 架构,负责处理请求并返回视图作为响应。@Controller
方法通常需要配合 @ResponseBody
注解,才能将返回值作为响应的主体内容。