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,需要带上accountpassword参数。

返回 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类。

无返回值示例

开发者也不可以不写返回值,直接操作HttpRequestHttpResponse

@Controller
public class ProjectController {

    @GetMapping("/project/get")
    public void get() {
        ...
    }

    @GetMapping("/project/info")
    public void info(HttpRequest request, HttpResponse response) {
        ...
    }
}

AndServer 支持一些方法参数是不需注解,直接写上就可以获取到,支持不用注解的参数有ContextHttpRequestHttpResponseRequestBody

@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类。


相关阅读推荐:

results matching ""

    No results matching ""