0
点赞
收藏
分享

微信扫一扫

网关模块之Spring的Web路由功能类RouterFunctions

sullay 2022-01-27 阅读 36



路由功能类RouterFunctions


  • ​​RouterFunctions​​
  • ​​嵌套类​​

  • ​​Builder​​
  • ​​Visitor​​

  • ​​成员变量​​
  • ​​RouterFunctions方法​​

  • ​​nest​​
  • ​​resourceLookupFunction​​
  • ​​resources​​
  • ​​route​​
  • ​​toHttpHandler​​
  • ​​toWebHandler​​



RouterFunctions

  • org.springframework.web.reactive.function.server.RouterFunctions


public abstract class RouterFunctions extends Object



  • Spring功能性web框架的中心入口点,包括路由功能

  • 使用可发现的生成器API创建一个RouterFunction
  • 使用指定的RequestPredicateHandlerFunction创建一个RouterFunction
  • 在已经存在的路由功能上创建一个子路由功能

  • RouterFunctions类可以将一个RouterFunction转化为一个HttpHandler

嵌套类

Builder

  • 表示一个可发现的路由功能生成器
public interface Builder {}

Visitor

  • 接收路由功能相关逻辑功能的通知
public interface Visitor {}

成员变量

/**
* 包含ServerWebExchange的ServerRequest属性的名称
*/
public static final String REQUEST_ATTRIBUTE = RouterFunctions.class.getName() + ".request";

/**
* 包含ServerWebExchange的URI templates变量,包括名称和值映射的map
*/
public static final String URI_TEMPLATE_VARIABLES_ATTRIBUTE =
RouterFunctions.class.getName() + ".uriTemplateVariables";

/**
* 包含ServerWebExchange的匹配模式属性,比如PathPattern
*/
public static final String MATCHING_PATTERN_ATTRIBUTE =
RouterFunctions.class.getName() + ".matchingPattern";

RouterFunctions方法

nest

  • 如果匹配给定的请求参数,则路由到对应的路由功能
/**
* 如果匹配给定的请求参数,则路由到对应的路由功能
* 该方法可以用于创建嵌套路由,一组路由可以共享相同的:
* - 路径前缀
* - 请求头
* - 其余请求参数
*
* @param predicate 请求参数
* @param routerFunction 需要委托路由到的嵌套路由
* @return 如果匹配给定的参数,则路由到对应的路由功能
*/
public static <T extends ServerResponse> RouterFunction<T> nest(RequestPredicate predicate, RouterFunction<T> routerFunction);
  • 示例:
  • ​RouterFunction<ServerResponse> routes = RouteFunctions.route(RequestPredicates.method(HttpMethod.GET), this :: listUsers) .addRoute(RequestPredicates.method(HttpMethod.POST), this :: createUser); RouterFunction<ServerResponse> nestedRoute = RouterFunctions.nest(RequestPredicate.path("/user"), userRoutes); ​

  • 首先创建一个组合路由,解析为listUsersGETcreateUserPOST
  • 然后根据请求参数 /user, 这样GET请求将会请求到listUser功能 ,Post请求将会请求到CreateUser功能

resourceLookupFunction

  • 返回resources(String, Resource) 需要使用的资源查询函数
/**
* 返回resources(String, Resource)需要使用的资源查询函数
* 如果资源查询函数不匹配可以返回一个默认的资源
*
* @param predicate 匹配的模式
* @param routerFunction 相对资源解析的目录路径
* @return 和所给的参数匹配的资源查询函数
*/
public static Function<ServerRequest,reactor.core.publisher.Mono<org.springframework.core.io.Resource>> resourceLookupFunction(String pattern, org.springframework.core.io.Resource location);
  • 示例:
Mono<Resource> defaultResource = Mono.just(new ClassPathResource("index.html"));
Function<ServerRequest, Mono<Resource>> lookupFunction = ResourceFunctions.resourceLookupFunction("/resources/**", new FileSystemResource("public-resources/")).andThen(resourceMono -> resource.switchIfEmpty(defaultResource));
ResourceFunction<ServerResponse> resources = ResourceFunctions.resources(lookupFunction);

resources

  • 路由使用提供的查询函数的资源
/**
* 路由到使用查询函数的资源
* 如果查询函数为给定的请求提供了一个Resource,那么将会被使用一个处理GET,HEAD和OPTIONS请求的HandlerFunction暴露出来
*
* @param lookupFunction 为给定的请求提供Resource的查询函数
* @return RouterFunction<ServerResponse> 路由到资源的路由
*/
public static RouterFunction<ServerResponse> resources(Function<ServerRequest,reactor.core.publisher.Mono<org.springframework.core.io.Resource>> lookupFunction);
  • 路由匹配的模式和路径的资源
/**
* 路由到匹配的模式和路径的资源
*
* @param pattern 匹配的模式
* @param location 请求路径
* @return RouterFunction<ServerResponse> 路由到给定资源
*/
public static RouterFunction<ServerResponse> resources(String pattern, org.springframework.core.io.Resource location);
  • 示例:
Resource location = new FileSystemResource("public-resources/");
RouterFunction<ServerResponse> resources = RouterFunctions.resources("/resources/**", location);

route

  • 以一种可发现的方法通过一个构建器接口创建一个路由功能
/**
* 以一种可发现的方法通过一个构建器接口创建一个路由功能
*
* @return RouterFunctions.Builder 一个路由功能的构建器
*/
public static RouterFunctions.Builder route();
  • 将请求谓词应用到给定的处理函数
/**
* 将给定的请求参数路由到指定的处理函数
*
* @param predicate 请求谓词
* @param handlerFunction 请求谓词应用到的处理函数
* @return RouterFunction<T> 将请求参数应用处理函数的路由
*/
public static <T extends ServerResponse> RouterFunction<T> route(RequestPredicate predicate, HandlerFunction<T> handlerFunction);
  • 示例:
RouterFunction<ServerResponse> route = RouterFunctions.route(RequestPredicate.GET("/user"), userController.listUsers);

toHttpHandler

  • 使用默认策略将一个路由功能转化为一个HttpHandler
  • 返回的HttpHandler可以进行以下调整:

  • Servlet 3.1+ServletHttpHandlerAdapter
  • ReactorReactorHttpHandlerAdapter
  • UndertowUndertowHttpHandlerAdapter

/**
* 使用默认的策略将一个路由功能转化为一个HttpHandler
*
* @param routerFunction 需要转换的路由功能
* @return HttpHandler 将路由功能按照默认策略转换的HttpHandler
*/
public static org.springframework.http.server.reactive.HttpHandler toHttpHandler(RouterFunction<?> routerFunction);
  • 使用指定的策略将一个路由转化为一个HttpHandler
  • 返回的HttpHandler可以进行以下调整:

  • Servlet 3.1+ServletHttpHandlerAdapter
  • ReactorReactorHttpHandlerAdapter

/**
* 使用指定的策略将一个路由转化为一个HttpHandler
*
* @param routerFunction 需要转换的路由功能
* @param strategies 路由转化策略
* @return HttpHandler 将路由功能按照指定策略转换的HttpHandler
*/
public static org.springframework.http.server.reactive.HttpHandler toHttpHandler(RouterFunction<?> routerFunction, HandlerStrategies strategies);

toWebHandler

  • 使用默认策略将一个路由转换为一个WebHandler
  • HttpWebHandlerAdapter也实现了WebHandler, 允许通过WebHttpHandlerBuilder进行额外的过滤器和异常处理程序注册
/**
* 使用默认策略将一个路由转换为一个WebHandler
*
* @param routerFunction 需要转换的路由功能
* @return WebHandler 将路由功能按照默认策略转化的WebHandler
*/
public static org.springframework.web.server.WebHandler toWebHandler(RouterFunction<?> routerFunction);
  • 使用指定策略将一个路由功能转换为一个WebHandler
/**
* 使用指定策略将一个路由功能转换为一个WebHandler
*
* @param routerFunction 路由功能
* @param strategies 指定的策略
* @return WebHandler 将路由功能按照指定策略转换的WebHandler
*/
public static org.springframework.web.server.WebHandler toWebHandler(RouterFunction<?> routerFunction, HandlerStrategies strategies);



举报

相关推荐

0 条评论