如何使用 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()
我需要使用 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()