【问题标题】:How to build URI with UriBuilder without specifying scheme, host separately?如何在不指定方案的情况下使用 UriBuilder 构建 URI,单独托管?
【发布时间】:2021-12-30 17:30:32
【问题描述】:

参考:org.springframework.web.util.UriBuilder

我正在使用 UriBuilder 为端点构建 URI

final String response = myWebClient.get()
   .uri(uriBuilder -> uriBuilder.scheme("https").path("example.com/mypage").path("/{id}.xml").build(id))
   .header(AUTHORIZATION, getAuthorizationHeaderValue(username, password))
   .accept(MediaType.TEXT_XML)
   .retrieve()
   .bodyToMono(String.class)
   .block();

但是,我已经在字符串变量中拥有值https://example.com/mypage(从数据库中获取)。我可以直接使用这个字符串而不是分别指定方案和路径/主机吗?现在我正在手动将主字符串拆分为单独的部分。

【问题讨论】:

    标签: spring-boot uri spring-webflux spring-webclient uribuilder


    【解决方案1】:

    您可以使用UriComponentsBuilder 来构建URI

    URI uri = UriComponentsBuilder.fromHttpUrl("https://example.com/mypage").path("/{id}.xml").build(id);
    
    myWebClient.get()
     .uri(uri)
     .header(AUTHORIZATION, getAuthorizationHeaderValue(username, password))
     ....
    

    或者,如果您需要发送的 HTTP 请求有一些通用设置(即在您的情况下是基本 url 和 Authorization 标头),您可以在 WebClient.Builder 级别配置它们。此构建器的 WebClient 构建将默认配置这些通用设置,因此您无需为每个 HTTP 请求一次又一次地配置它们。比如:

    @Component 
    public class ExampleComClient {
    
    
        private final WebClient webClient;
    
        @Autowired
        public ExampleComClient(WebClient.Builder builder) {
            this.webClient = builder.baseUrl("https://example.com/mypage")
                                .defaultHeader(AUTHORIZATION, getAuthorizationHeaderValue(username, password))
                                .build();
        }
    
        public String getById(Integer id){
    
           return webClient.get()
                    .uri(uriBuilder -> uriBuilder.path("/{id}.xml").build(id))      
                   .accept(MediaType.TEXT_XML)
                   .retrieve()
                   .bodyToMono(String.class)
                   .block();
        }
    
    
         public String getByName(String name){
    
           return webClient.get()
                    .uri(uriBuilder -> uriBuilder.queryParam("name",name).build())      
                   .accept(MediaType.TEXT_XML)
                   .retrieve()
                   .bodyToMono(String.class)
                   .block();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多