Spring URI 操作工具类

前言

Spring 提供了许多 URI 操作工具类,方便我们对 URI 进行处理。

UriComponents

UriComponentsBuilder 使用 URI 模版和变量来构建 URI,避免通过字符串拼接构建 URI。

UriComponents uriComponents = UriComponentsBuilder
		.fromUriString("https://example.com/hotels/{hotel}")
		.queryParam("q", "{q}")  // 添加参数
		.encode()
		.build();  // 构建

// 填充变量并获取 URI 对象
URI uri = uriComponents.expand("Westin", "123").toUri();

也可以在一条语句中直接构建生成。

URI uri = UriComponentsBuilder
		.fromUriString("https://example.com/hotels/{hotel}")
		.queryParam("q", "{q}")
		.encode()
		.buildAndExpand("Westin", "123")
		.toUri();

// 更简化的版本,自动 encoding
URI uri = UriComponentsBuilder
		.fromUriString("https://example.com/hotels/{hotel}")
		.queryParam("q", "{q}")
		.build("Westin", "123");

// 合并请求参数
URI uri = UriComponentsBuilder
		.fromUriString("https://example.com/hotels/{hotel}?q={q}")
		.build("Westin", "123");

UriBuilderFactory

UriComponentsBuilder 实现了 UriBuilder 接口,而要创建 UriBuilder 接口的实例,也可以通过 UriBuilderFactory 接口。DefaultUriBuilderFactory 是 UriBuilderFactory 的一个默认的实现类。

我们可以直接使用这个工厂类来创建 UriComponentsBuilder。

String baseUrl = "https://example.com";
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl);

URI uri = uriBuilderFactory.uriString("/hotels/{hotel}")
		.queryParam("q", "{q}")
		.build("Westin", "123");

但更常用的是和 HTTP 客户端结合使用,可以和 RestTemplate 或 WebClient 等 Spring 提供的 HTTP 客户端配合使用,来方便地配置 URI。

下面是 RestTemplate 的使用例子:

String baseUrl = "https://example.org";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setUriTemplateHandler(factory);

下面是 WebClient 的使用例子:

String baseUrl = "https://example.org";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
WebClient client = WebClient.builder().uriBuilderFactory(factory).build();

ServletUriComponentsBuilder

可以使用 ServletUriComponentsBuilder 工具类创建基于当前请求 URI 的相对请求。

// 获取当前请求对象
HttpServletRequest request = ...

// 复用了 scheme, host, port, path, query string...
URI uri = ServletUriComponentsBuilder.fromRequest(request)
		.replaceQueryParam("accountId", "{id}")
		.build("123");

// 复用了 scheme, host, port, context path...
URI uri = ServletUriComponentsBuilder.fromContextPath(request)
		.path("/accounts")
		.build()
		.toUri();

// 复用了 scheme, host, port, context path, Servlet mapping prefix...
URI uri = ServletUriComponentsBuilder.fromServletMapping(request)
		.path("/accounts")
		.build()
		.toUri();

MvcUriComponentsBuilder

MvcUriComponentsBuilder 可以从控制器类来创建请求 URI。

假设我们有如下的控制器。

@Controller
@RequestMapping("/hotels/{hotel}")
public class BookingController {

	@GetMapping("/bookings/{booking}")
	public ModelAndView getBooking(@PathVariable Long booking) {
		// ...
	}
}

我们通过如下的方法创建对应的请求 URI。

// 21 是方法的参数,而 42 是路径参数 hotel
UriComponents uriComponents = MvcUriComponentsBuilder
	.fromMethodName(BookingController.class, "getBooking", 21).buildAndExpand(42);

URI uri = uriComponents.encode().toUri();

本文主要介绍了 Spring 提供的一些创建 URI 的工具类,想了解更多 Spring Web 的内容,可参考我写的 Spring Web 速查指南

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的工具类,用于将路由配置从数据库中读取并转换为Spring Cloud Gateway的路由定义: ```java @Component public class DatabaseRouteDefinitionProvider implements RouteDefinitionProvider { private final JdbcTemplate jdbcTemplate; public DatabaseRouteDefinitionProvider(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public Flux<RouteDefinition> getRouteDefinitions() { List<RouteDefinition> definitions = jdbcTemplate.query("SELECT * FROM routes", rs -> { List<RouteDefinition> routes = new ArrayList<>(); while (rs.next()) { RouteDefinition route = new RouteDefinition(); route.setId(rs.getString("id")); route.setUri(URI.create(rs.getString("uri"))); route.setOrder(rs.getInt("route_order")); String predicatesJson = rs.getString("predicates"); List<PredicateDefinition> predicates = new ObjectMapper().readValue(predicatesJson, new TypeReference<List<PredicateDefinition>>() {}); route.setPredicates(predicates); String filtersJson = rs.getString("filters"); List<FilterDefinition> filters = new ObjectMapper().readValue(filtersJson, new TypeReference<List<FilterDefinition>>() {}); route.setFilters(filters); routes.add(route); } return routes; }); return Flux.fromIterable(definitions); } } ``` 这个工具类使用Spring JDBC来查询数据库中的路由配置,并使用Jackson库将JSON字符串转换为Spring Cloud Gateway的路由定义对象。然后,它将这些定义添加到一个Flux对象中,并返回它以供Spring Cloud Gateway使用。请注意,此工具类仅提供了一种从数据库中读取路由配置的方法,您可以根据需要进行修改以适应您的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值