多个查询参数值以逗号分隔列表

时间:2017-09-01 23:58:44

标签: query-parameters spring-web

是否可以将具有多个参数值的网址构建为以逗号分隔的列表?

以下代码段打印网址:

import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponentsBuilder;

public class MyMain {
    public static void main(String[] args) {

        MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
        queryParams.add("order", "1");
        queryParams.add("order", "2");

        System.out.println(UriComponentsBuilder.fromHttpUrl("http://example.com")
            .queryParams(queryParams)
            .build()
            .toString());
    }
}

此代码生成的网址为:

http://example.com?order=1&order=2

我想得到的是:

http://example.com?order=1,2

使用另一个框架不是一个选项,因为我使用框架,我想避免构建逻辑来构建我的方式。

弹簧网或弹簧靴中有什么可以做到的吗?

3 个答案:

答案 0 :(得分:1)

尝试使用 String.join

package com.deliveryhero.discovery.common.dtos.recommendation;

import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.Collection;

import static java.util.Arrays.asList;

public class MyMain {
    public static void main(String[] args) {

        Collection<String> values = asList("1","2");
        MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
        queryParams.add("order", String.join(",", values));

        System.out.println(UriComponentsBuilder.fromHttpUrl("http://example.com")
                .queryParams(queryParams)
                .build()
                .toString());
    }
}

答案 1 :(得分:0)

我有同样的问题,但我也找不到任何Spring解决方案。因此我为此写了一个简单的辅助函数:

@Test
public void testCreateValidMatrixVariableUrl() {
    MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
    queryParams.add("order", "1");
    queryParams.add("order", "2");

    String invalidUrl = UriComponentsBuilder.fromHttpUrl("http://example.com")
            .path("").query("order={order}")
            .buildAndExpand(queryParams)
            .toString();

    assertThat(prepareMatrixVariableUrl(invalidUrl)).isEqualTo("http://example.com?order=1,2");
}

private String prepareMatrixVariableUrl(String url) {
    return url.replaceAll("\\[", "")
            .replaceAll("\\]", "")
            .replaceAll(" ", "");
}

请注意,prepareMatrixVariableUrl(...)会替换所有括号([])和空格(),因为如果不应用辅助函数,您的网址变量将具有格式如:http://example.com?order=[1, 2]

答案 2 :(得分:0)