在 WebMvc.fn 中,HTTP 请求是通过 HandlerFunction 处理的:一个接收 ServerRequest 并返回 ServerResponse 的函数。请求和响应对象都有不可变的契约,提供 JDK 8 对 HTTP 请求和响应的友好访问。HandlerFunction 相当于基于注解的编程模型中的 @RequestMapping方法的主体。
传入的请求被路由到具有 RouterFunction 的处理函数:该函数接收 ServerRequest 并返回一个可选的 HandlerFunction(即可选的<HandlerFunction>)。当路由器函数匹配时,将返回一个处理函数;否则将返回一个空的 Optional。RouterFunction 相当于 @RequestMapping注解,但主要区别在于,路由器函数不仅提供数据,还提供行为。
RouterFunctions.route()提供了一个路由器生成器,方便了路由器的创建,如下例所示:
import static org.springframework.http.MediaType.APPLICATION_JSON;import static org.springframework.web.servlet.function.RequestPredicates.*;import static org.springframework.web.servlet.function.RouterFunctions.route;PersonRepository repository = ...PersonHandler handler = new PersonHandler(repository);RouterFunction<ServerResponse> route = route().GET("/person/{id}", accept(APPLICATION_JSON), handler::getPerson).GET("/person", accept(APPLICATION_JSON), handler::listPeople).POST("/person", handler::createPerson).build();public class PersonHandler {// ...public ServerResponse listPeople(ServerRequest request) {// ...}public ServerResponse createPerson(ServerRequest request) {// ...}public ServerResponse getPerson(ServerRequest request) {// ...}}
如果你把 RouterFunction 注册为 Bean,例如通过在 @Configuration类中公开它,它将被 servlet 自动检测到,正如在运行服务器中解释的那样。
例子
该例子使用了后面章节的知识点
package cn.mrcode.study.springdocsread.fn;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.function.RouterFunction;import org.springframework.web.servlet.function.ServerResponse;import static org.springframework.http.MediaType.APPLICATION_JSON;import static org.springframework.web.servlet.function.RequestPredicates.accept;import static org.springframework.web.servlet.function.RouterFunctions.route;/*** @author mrcode*/@Configurationpublic class FnConfig {@Bean // 交给 ioc 容器public RouterFunction<ServerResponse> fun1() {final TestHandler handler = new TestHandler();RouterFunction<ServerResponse> route = route().GET("/person/{id}", accept(APPLICATION_JSON), handler::getPerson).GET("/person", accept(APPLICATION_JSON), handler::listPeople).POST("/person", handler::createPerson).build();return route;}}
package cn.mrcode.study.springdocsread.fn;import org.springframework.web.servlet.function.ServerRequest;import org.springframework.web.servlet.function.ServerResponse;/*** @author mrcode*/public class TestHandler {// ...public ServerResponse getPerson(ServerRequest request) {final String id = request.pathVariable("id");return ServerResponse.ok().body("你发送的 ID = " + id);}public ServerResponse listPeople(ServerRequest request) {return ServerResponse.ok().body("Hello World");}public ServerResponse createPerson(ServerRequest request) {return ServerResponse.ok().body("POST");}}
启动后,访问 [http://localhost:8080/person/123](http://localhost:8080/person/123) 或则其他两个 URL ,就能访问到上面 testHandler 对应的方法
