RestController
Controller 这个单词的愿意是控制器或者调节器,在开发中我们习惯性的把它叫做控制器。在 AndServer 中有两种控制器,一种是添加了Controller注解的控制器,另一种是添加了RestController注解的控制器。开发者万不可将此二注解与 Controller 的含义混淆了,例如我们都是开发者,但是分为 Java 开发者、Python 开发者、C 开发者一样,所以程序中有 Controller,但是加个Controller注解和RestController就表示它们是不同功能的控制器。
Controller注解和RestController注解只能添加到类上,一般用作 HTTP API 的分类,例如UserController用来提供处理用户的相关 HTTP API,ShopController用来提供处理店铺的相关 HTTP API。
作用
添加了RestController注解的类中的方法拥有将返回值直接输出到客户端的能力。
添加了Controller注解的控制器中的方法的返回值经过ViewResolver分析,如果是ResponseBody则会直接写出到客户端、如果是其它类型的数据会先经过MessageConverter转化成ResponseBody再输出到客户端,如果开发者没有提供MessageConverter怎会将返回值toString()后组成StringBody输出。
MessageConverter 非常有用,比如将客户端的参数转化为 Model,将服务端的 Model 转化为 JSON、Prorobuf 等个时候输出等,具体使用方法请参考MessageConveter类和Converter注解。
根据字面意思RestController就是写 RESTful 风格的 HTTP API 的,因此它更加适合输出一些 JSON 格式、Protubuf 格式的数据。
返回 String 示例
@RestController
public class UserController {
@PostMapping("/user/login")
String login(@RequestParam("account") String account,
@RequestParam("password") String password) {
if("123".equals(account) && "123".equals(password)) {
return "Login successful.";
} else {
return "Login failed.";
}
}
}
示例中的
PostMapping注解请参考RequestMapping章节,RequestParam注解请参考RequestParam章节。
上述示例则完成了一个模拟用户登录的 HTTP API,假设服务器的 IP 地址是192.168.1.11,监听的端口是8080,此时即可通过http://192.168.1.11:8080/user/login方法此 HTTP API,需要带上account和password参数。
返回 JSON 示例
@RestController
public class UserController {
/**
* Get user information.
*/
@GetMapping("/user/info")
String userList(@RequestParam("id") String id) {
User user = new User();
user.setId(id);
user.setName("AndServer");
return JSON.toJSONString(user);
}
/**
* Get user list.
*/
@GetMapping("/user/get")
JSONObject userList() {
JSONObject jsonObj = ...;
return jsonObj;
}
}
上述代码中第一个方法是用户详情 HTTP API,第二个方法用户列表 HTTP API,数据格式都为 JSON,示例中是由开发者手动把数据转为 JSON 的,略嫌麻烦。
返回 Java 对象示例
@RestController
public class UserController {
/**
* Get user information.
*/
@GetMapping("/user/info")
public User userList(@RequestParam("id") String id) {
User user = new User();
user.setId(id);
user.setName("AndServer");
return user;
}
/**
* Get user list.
*/
@GetMapping("/user/list")
public List<User> userList() {
List<User> users = new ArrayList<>();
for (int i = 0; i < 100; i++) {
User user = new User();
user.setName("User" + i);
users.add(user);
}
return users;
}
}
直接返回 Model 需要开发者提供
MessageConverter来做数据转换,否则返回出去的 Model 将会被toString()后当作String输出,具体使用方法请参考Converter注解和MessageConverter类。
返回 ResponseBody 示例
事实上,以上示例中的返回值,最后都被包装为ResponseBody后发送出去,因此如果开发者返回ResponseBody将被直接发送到客户端而不经过MessageConverter,因此我们可以直接返回ResponseBody:
@Controller
public class ProjectController {
@GetMapping("/project/info")
public Object info() {
String context = ...;
return new StringBody(context);
}
@GetMapping("/project/file")
public FileBody info() {
File file = ...;
return new FileBody(file);
}
@GetMapping("/project/info")
public ResponseBody info() {
JSONObject jsonObj = ...;
return new JsonBody(jsonObj);
}
}
更多使用方法请参考ResponseBody类。
无返回值示例
开发者也不可以不写返回值,直接操作HttpRequest和HttpResponse:
@Controller
public class ProjectController {
@GetMapping("/project/get")
public void get() {
...
}
@GetMapping("/project/info")
public void info(HttpRequest request, HttpResponse response) {
...
}
}
AndServer 支持一些方法参数是不需注解,直接写上就可以获取到,支持不用注解的参数有Context、HttpRequest、HttpResponse、RequestBody:
@Controller
public class ProjectController {
@GetMapping("/project/context")
public void get(Context context, @RequestParam("name") String name) {
...
}
@GetMapping("/project/body")
public void body(RequestBody body, HttpResponse response) {
...
}
}
直接操作HttpResponse时可能会涉及到设置ResponseBody。
@Controller
public class ProjectController {
@GetMapping("/project/info")
public void info(HttpRequest request, HttpResponse response) {
String content = ...;
RequestBody body = new StringBody(content);
response.setBody(body);
}
}
更多使用方法请参考ResponseBody类。
相关阅读推荐: