如何动态删除空查询参数?

时间:2021-03-08 18:16:56

标签: java rest http

我向 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();
}

当可选查询参数的数量增加时,它会变得非常麻烦。

1 个答案:

答案 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();
}