在 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
*/
@Configuration
public 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 对应的方法