通过 spring 网络客户端发送 json 字符串作为查询参数
Sending a json string as query parameter via spring web client
我正在尝试使用下面的代码使用 Spring WebClient 发送 json 字符串作为查询参数。
var client = WebClient.builder()
.baseUrl(baseurl)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build()
client.post().uri(uriBuilder -> uriBuilder.path("/api/SomeRequest")
.queryParam("response", responseJsonStr).build()
).retrieve().bodyToMono(ReponseObj.class).block()
我看到一个错误
java.lang.IllegalArgumentException: Not enough variables available to expand questionKey.
根据我所做的搜索,我可以看出问题出在我作为查询参数提供的 Json 字符串(它有“{”和“}”)。我认为这可能与 URI 编码有关。但是查看有关 encoding 的详细信息,我不确定解决此问题的最佳方法是什么。
注意:我无法更改期望 Json 字符串作为查询参数的服务器(它稍后在提取查询参数后解码 json)。
看起来你知道发送一个 json 字符串作为查询参数而不是 post 正文是一个非常糟糕的主意,所以我不会进一步讨论它。
你是对的。您必须在客户端对查询参数进行编码才能使其正常工作。您可以像这样简单地编码参数:
.queryParam("response", URLEncoder.encode(responseJsonStr, StandardCharsets.UTF_8))
只要确保您使用与服务器端相同的字符集即可。
我正在尝试使用下面的代码使用 Spring WebClient 发送 json 字符串作为查询参数。
var client = WebClient.builder()
.baseUrl(baseurl)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build()
client.post().uri(uriBuilder -> uriBuilder.path("/api/SomeRequest")
.queryParam("response", responseJsonStr).build()
).retrieve().bodyToMono(ReponseObj.class).block()
我看到一个错误
java.lang.IllegalArgumentException: Not enough variables available to expand questionKey.
根据我所做的搜索,我可以看出问题出在我作为查询参数提供的 Json 字符串(它有“{”和“}”)。我认为这可能与 URI 编码有关。但是查看有关 encoding 的详细信息,我不确定解决此问题的最佳方法是什么。 注意:我无法更改期望 Json 字符串作为查询参数的服务器(它稍后在提取查询参数后解码 json)。
看起来你知道发送一个 json 字符串作为查询参数而不是 post 正文是一个非常糟糕的主意,所以我不会进一步讨论它。
你是对的。您必须在客户端对查询参数进行编码才能使其正常工作。您可以像这样简单地编码参数:
.queryParam("response", URLEncoder.encode(responseJsonStr, StandardCharsets.UTF_8))
只要确保您使用与服务器端相同的字符集即可。