如何使用 Spring Webclient 在 GET URL 上传递 JSON

How to pass JSON on a GET URL with Spring Webclient

我需要使用 URL 调用外部服务,如下所示...

获取https://api.staging.xxxx.com/locations?where={"account":"bob"}

这不是我的服务,我对它没有影响,目前我的代码库正在使用 Spring WebClient。

WebClient.create("https://api.staging.xxxx.com/")
.get()
.uri(uriBuilder -> uriBuilder.path("locations?where={'account':'bob'}").build())

由于 WebClient 看到 { 括号,它试图将一个值注入 URL,这是我不想要的。

任何人都可以建议我如何使用 Spring WebClient 吗?

否则我将恢复到 OKHttp 或其他基本客户端来发送此请求。

实现此目的的一种方法是在将值传递给 uri 构建器之前手动 url 对其进行编码。

另外我认为你应该使用queryParam()来指定查询参数。

uriBuilder -> 
  uriBuilder.path("locations")
            .queryParam("where", "%7B'account':%20'bob'%7D")
            .build()

另一种选择是在创建 WebClient 时配置编码模式

 DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();
 factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
 WebClient.builder().uriBuilderFactory(factory).build();

您可以使用 UriUtils#encodeQueryParams 对 JSON 参数进行编码:

String whereParam = "{\"account\":\"bob\"}";

 //...
uriBuilder
   .path("locations")
   .queryParam("where", UriUtils.encodeQueryParam(whereParam, StandardCharsets.UTF_8))
   .build()