在 spring webflux 中使用 uri() 时如何保留 baseUrl

How to keep baseUrl when using uri() in spring webflux

使用 spring boot 2.1.3.RELEASE,WebClient 将在传递 URIuri() 方法时停止使用提供的 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 is not absolute:

请求 url 变为

request url: /foo/%23bar

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

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

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

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

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

在你的例子中,它简单地简化为:

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

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