URI在网络请求中必不可少。Spring提供了一些解析或生成URL的工具类,比如根据参数生成GETURL。本文将介绍SpringMVC中的URI工具。本文主要参考Spring官方文档。工具类UriComponentsUriComponentsBuilder可用于根据URL和参数构建路径。例如,我们需要一个带有GET参数的URL。通常,我们需要自己拼接URL,添加“&”、“?”等参数。UriComponentsBuilder提供了一种更简洁的方式来构建URL:UriComponentsuriComponents=UriComponentsBuilder.fromUriString("https://example.com/hotels/{hotel}").queryParam("q","{q}").encode()。建造();//https://example.com/hotels/Westin?q=123URIuri=uriComponents.expand("Westin","123").toUri();以上两条语句也可以组合成一条Build链,使用下面的方法达到同样的目的:URIuri=UriComponentsBuilder.fromUriString("https://example.com/hotels/{hotel}").queryParam("q","{q}").encode().buildAndExpand("Westin","123").toUri();URIuri=UriComponentsBuilder.fromUriString("https://example.com/hotels/{hotel}").queryParam("q","{q}").build("Westin","123");URIuri=UriComponentsBuilder.fromUriString("https://example.com/hotels/{hotel}?q={q}").build("威斯汀","123");接口UriBuilderUriComponentsBuilder实现UriBuilder接口。该接口的主要作用是构建一个UriBuilder实例,可以通过UriSpring中的UriBuilderFactory获取。我们一般使用Spring的RestTemplate等httpClient类,不需要自己拼接Uri。我们只需要输入参数组件就可以自动拼接Url。对于Spring的RestTemplate,内部使用的Url组件是UriBuilderFactory。//导入o??rg.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;StringbaseUrl="https://example.org";DefaultUriBuilderFactoryfactory=newDefaultUriBuilderFactory(baseUrl);factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);RestTemplaterestTemplate=newRestTemplate();restTemplate.setUriTemplateHandler(factory);//importorg.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;StringbaseUrl="https://example.org";DefaultUriBuilderFactoryfactory=newDefaultUriBuilderFactory(baseUrl);工厂。setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);WebClientclient=WebClient.builder().uriBuilderFactory(factory).build();StringbaseUrl="https://example.com";DefaultUriBuilderFactoryuriBuilderFactory=newDefaultUriBuilderFactory(baseUrl);URIuri=uriBuilderFactory.uriString("/hotels/{hotel}").queryParam("q","{q}").build("Westin","123");Url编码UriComponentsBuilder组件提供了两种编码方式:UriComponentsBuilder#encode():对Url模板和参数分别进行编码再拼接UriComponents#encode():对拼接后的Url编码操作进行编码。UriComponentsBuilder#encode()适用于大多数情况,因为它单独对参数进行编码。但是如果你需要在编码中保留特殊字符,那么最好使用第二种编码。URIuri=UriComponentsBuilder.fromPath("/hotellist/{city}").queryParam("q","{q}").encode().buildAndExpand("NewYork","foo+bar").toUri();//Resultis"/hotel%20list/New%20York?q=foo%2Bbar"ServletUri构建Spring提供了另一个Uri组件ServletUriComponentsBuilder,它可以根据Servlet请求构建一个新的Uri:HttpServletRequestrequest=...//重新使用主机、方案、端口、路径和查询字符串...ServletUriComponentsBuilderucb=ServletUriComponentsBuilder.fromRequest(request).replaceQueryParam("accountId","{id}").build().expand("123").encode();//重新使用主机、端口和上下文路径...ServletUriComponentsBuilderucb=ServletUriComponentsBuilder.fromContextPath(request).path("/accounts").build()//重新使用主机,端口、上下文路径和Servlet前缀...ServletUriComponentsBuilderucb=ServletUriComponentsBuilder.fromServletMapping(request).path("/accounts").build()ControllerUri我们知道,在Spring中,一个请求可以通过@RequestMapping映射到一个Controller方法,那么我们如何获取Controller方法的请求路径呢?@Controller@RequestMapping("/hotels/{hotel}")publicclassBookingController{@GetMapping("/bookings/{booking}")publicModelAndViewgetBooking(@PathVariableLongbooking){//...}}Spring提供了MvcUriComponentsBuilder工具获取Controller方法对应的路径,其使用示例如下://21:表示参数类型,42:新参数类型。UriComponentsuriComponents=MvcUriComponentsBuilder.fromMethodName(BookingController.class,"getBooking",21)。buildAndExpand(42);URIuri=uriComponents.encode().toUri();UriComponentsuriComponents=MvcUriComponentsBuilder.fromMethodCall(on(BookingController.class).getBooking(21)).buildAndExpand(42);URIuri=uriComponents.encode().toUri();Controller方法应该是非Final的,否则Spring可能无法获取配置的路径信息MvcUriComponentsBuilder也支持指定Context,比如域名等信息,示例如下:on(BookingControl.class).getBooking(21)).buildAndExpand(42);URIuri=uriComponents.encode().toUri();视图中的URL在Thymeleaf、FreeMarker、JSP等视图组件中,我们可以使用视图URL组件去拼接URL,示例如下:@RequestMapping("/people/{id}/addresses")publicclassPersonAddressController{@RequestMapping("/{country}")publicHttpEntity
