【问题标题】:Having queryParam with "+" using UriComponentsBuilder使用 UriComponentsBuilder 让 queryParam 带有“+”
【发布时间】:2020-10-05 09:49:18
【问题描述】:

基于问题Spring's UriComponentsBuilder.queryParam issue,如果查询参数的值中有一个加号(“+”)怎么办?默认情况下,加号不会编码。为什么以及如何强制执行此操作?

在我的示例中,我想使用 da ISO 编码的时间戳,并且需要对加号进行编码,因为另一个端点会将“+”解释为空格(“”),这会被时间戳打破。

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://example.com/api/")//
        .queryParam("date1", "2020-10-05T08:20:00.000+02:00") //
        .query("date2=2020-10-05T08:20:00.000+02:00");

System.out.println(builder.build().toString());
// produces https://example.com/api/?date1=2020-10-05T08:20:00.000+02:00&date2=2020-10-05T08:20:00.000+02:00

System.out.println(builder.build().encode().toString());
// produces https://example.com/api/?date1=2020-10-05T08:20:00.000+02:00&date2=2020-10-05T08:20:00.000+02:00

预期结果应将加号编码为2020-10-05T08%3A20%3A00.000%2B02%3A00 或至少将2020-10-05T08:20:00.000%2B02:00 编码为%2B

【问题讨论】:

  • 我发现,使用RestTemplate时可能会出现问题。我尝试替换硬编码的“+”,但在使用“restTemplate.exchange(...)”后,我的“%”被引用到%20
  • 我找到了解决方案...应该更好地搜索:stackoverflow.com/questions/51676060/…

标签: java spring rest


【解决方案1】:

您可以使用 DefaultUriBuilderFactory 对查询值进行编码,如下所示:

String baseUrl = "https://example.com";
        DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl);

        String uri = uriBuilderFactory.uriString("/api/")
                .queryParam("date1", "{date1}")
                .build("2020-10-05T08:20:00.000+02:00").toString(); // https://example.com/api/?date1=2020-10-05T08%3A20%3A00.000%2B02%3A00

【讨论】:

  • @MichaelLindner 我已经编辑了答案,所以如果输出格式更适合您的需求,您可以尝试一下
  • 您的解决方案单独有效。现在形成,我认为问题可能在以后......使用RestTemplate时。看起来,这也对查询进行了编码。回到问题:“+”不会被编码,因为它是一个有效的字符。但在我的用例中,“+”不是编码的“”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
相关资源
最近更新 更多