我向 API 发送了一些 get 查询,当我发送空查询参数时,该 API 返回 400 错误请求。
但是,我事先不知道哪些可选查询参数会为空。 除了测试每个可选参数是否为空之外,有没有更简单的方法来动态移除空参数?
目前我在做:
private URI getApiUrl(QueryParametersObject qpo) {
String url = configBundle.getPropertyStr("some.api.url");
UriComponentsBuilder builder = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("mandatoryParam1", qpo.getMandatoryParam1()) // MANDATORY
.queryParam("mandatoryParam2", qpo.getMandatoryParam2()); // MANDATORY
if (!qpo.getOptionalParam1().isEmpty())
builder.queryParam("optionalParam1", qpo.getOptionalParam1());
if (!qpo.getOptionalParam2().isEmpty())
builder.queryParam("optionalParam2", qpo.getOptionalParam2());
if (!qpo.getOptionalParam3().isEmpty())
builder.queryParam("optionalParam3", qpo.getOptionalParam3());
return builder.build().encode().toUri();
}
当可选查询参数的数量增加时,它会变得非常麻烦。
答案 0 :(得分:0)
一种方法是使用较新版本的 spring-web
,例如 5.3.4
,其中类 UriComponentsBuilder
获得一个新方法 UriBuilder queryParamIfPresent(String name, Optional<?> value)
,您可以使用它像这样:
private URI getApiUrl(QueryParametersObject qpo) {
String url = configBundle.getPropertyStr("some.api.url");
UriComponentsBuilder builder = UriComponentsBuilder
.fromHttpUrl(url)
.queryParam("mandatoryParam1", qpo.getMandatoryParam1()) // MANDATORY
.queryParam("mandatoryParam2", qpo.getMandatoryParam2()) // MANDATORY
.queryParamIfPresent("optionalParam1", Optional.of(qpo.getOptionalParam1()))
.queryParamIfPresent("optionalParam2", Optional.of(qpo.getOptionalParam2()))
.queryParamIfPresent("optionalParam3", Optional.of(qpo.getOptionalParam3()));
return builder.build().encode().toUri();
}