如何在不指定方案、单独托管的情况下使用 UriBuilder 构建 URI?

How to build URI with UriBuilder without specifying scheme, host separately?

参考: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。我可以直接使用这个字符串而不是单独指定方案和 path/host 吗?现在我正在手动将主字符串拆分成单独的部分。

您可以使用 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 和授权 header),您可以在 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();
    }

}