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

Posted

技术标签:

【中文标题】如何在不指定方案的情况下使用 UriBuilder 构建 URI,单独托管?【英文标题】:How to build URI with UriBuilder without specifying scheme, host separately? 【发布时间】: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(从数据库中获取)。我可以直接使用这个字符串而不是分别指定方案和路径/主机吗?现在我正在手动将主字符串拆分为单独的部分。

【问题讨论】:

【参考方案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();
    


【讨论】:

以上是关于如何在不指定方案的情况下使用 UriBuilder 构建 URI,单独托管?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用代码的情况下使用约束 AutoLayout 来指定横向与纵向的不同布局?

js - 在不指定元素的情况下模拟按键

Django:在不指定主键的情况下创建固定装置?

如何在不指定字段名称的情况下使用 mongodb 在 nodejs 中进行部分数据搜索? [复制]

如何在不指定完整命名空间的情况下使用 OData(7.4) .Net Core 过滤枚举列表?

如何在不将 nib 名称指定为字符串的情况下使用 nib 加载 View Controller 子类?