【问题标题】:How to keep baseUrl when using uri() in spring webflux在spring webflux中使用uri()时如何保留baseUrl
【发布时间】:2019-07-11 00:15:36
【问题描述】:

使用 spring boot 2.1.3.RELEASE,WebClient 将在将URI 传递给uri() 方法时停止使用提供的baseUrl。但是,当将字符串传递给 uri() 时,它将保留 baseUrl

如何提供baseUrl 并传递URI

public WebClient webClient() {
  return WebClient.builder()
    .baseUrl("https://example.com/")
    .build();
}

webClient.get().uri(URI.create("/foo/%23bar"))... 

抛出

java.lang.IllegalArgumentException:URI 不是绝对的:

请求的url变成了

request url: /foo/%23bar

【问题讨论】:

  • 我认为这是一个错误。它发生在URIString

标签: java spring spring-webflux


【解决方案1】:

一旦你设置了一个UriBuilderFactory 就像你通过baseUrl(String uri) 调用所做的那样,添加所需分支的最简单方法是使用 uri(String uri,Object... uriVariables) 签名,如果没有指定第二个参数给定的声明为可变参数,那么长度可以是 0。

在您的情况下,它只是简化为:

public WebClient webClient() {
  return WebClient.builder()
    .baseUrl("https://example.com")
    .build();
}

webClient.get().uri("/foo/bar")

【讨论】:

    【解决方案2】:

    稍微不同的方式 - 在现有的 uri 对象上使用 path 而不是 pathSegment。它有助于以配置/常量形式方便地维护路径。

    final WebClient webClient = WebClient
    .builder()
    .baseUrl("http://localhost")
    .build();
    webClient
    .get()
    .uri(uriBuilder -> uriBuilder.path("api/v2/json/test").build())
    .exchange();
    

    【讨论】:

      【解决方案3】:

      如果您传递新的 URI 对象,则会覆盖基本 URI。 您应该使用 uri 方法和 lambda 作为参数,例如:

      final WebClient webClient = WebClient
        .builder()
        .baseUrl("http://localhost")
        .build();
      webClient
        .get()
        .uri(uriBuilder -> uriBuilder.pathSegment("api", "v2", "json", "test").build())
        .exchange();
      

      【讨论】:

        猜你喜欢
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        相关资源
        最近更新 更多