java URIBuilder 和列表查询参数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35695586/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 00:28:06  来源:igfitidea点击:

URIBuilder and list query params

javaweb-servicesrestquery-parametersuribuilder

提问by Tobia

I'm using apache URIBuilderto build a query string for a GET methodof a Rest service.

我正在使用 apache URIBuilder为Rest 服务的GET 方法构建查询字符串。

@RequestMapping(value="/remote") 
    public Return getTest(Ordine ordine) throws Exception{
        ...
    }

This is the input object:

这是输入对象:

public class Ordine{    
    private List<String> codici;
    //..get...set..
}

I cannot understand how to set this string list as query params.

我无法理解如何将此字符串列表设置为查询参数。

I tried to set param twice:

我试图设置参数两次:

URIBuilder builder = new URIBuilder()
                .setHost("localhost")
                .setPort(8080)
                .setScheme("http")
                .setPath("/remote")
                .setParameter("codici", codicilist.get(0))
                .setParameter("codici", codicilist.get(1));

But the first param it will be overwrite from the second. Then I tried to append [] in the param name:

但是第一个参数会被第二个参数覆盖。然后我尝试在参数名称中附加 []:

URIBuilder builder = new URIBuilder()
                .setHost("localhost")
                .setPort(8080)
                .setScheme("http")
                .setPath("/remote")
                .setParameter("codici[]", codicilist.get(0))
                .setParameter("codici[]", codicilist.get(1));

But it is simply sent with name "codici[]" and the first param is overwritten. Then I tried a comma separated values:

但它只是以名称“codici[]”发送,第一个参数被覆盖。然后我尝试了逗号分隔值:

URIBuilder builder = new URIBuilder()
                .setHost("localhost")
                .setPort(8080)
                .setScheme("http")
                .setPath("/remote")
                .setParameter("codici", String.join(",",codicilist));

But if fails... how can I set a list of param?

但是如果失败...我如何设置参数列表?

采纳答案by Markus Wagner

In your expample, just use addParameterinstead of setParameter. setParameterwill override your parameter if it already exists. addParameterwill add a new one (ignoring existing ones).

在您的示例中,只需使用addParameter代替setParameter. setParameter如果它已经存在,将覆盖您的参数。addParameter将添加一个新的(忽略现有的)。

回答by Bunti

You can use addParametersmethod.

您可以使用addParameters方法。

URIBuilder builder = new URIBuilder()
            .setHost("localhost")
            .setPort(8080)
            .setScheme("http")
            .setPath("/remote").addParameters(buildParamList())

Then get all codiciparameter values with a helper method which will build a list of NameValuePairpairs.

然后codici使用一个辅助方法获取所有参数值,该方法将构建一个NameValuePair对列表 。

private List<NameValuePair> buildParamList() {
    List<NameValuePair> output = new ArrayList<>();
    for (String string : codici) {
        output.add(new BasicNameValuePair("codici", string));
    }
    return output;
}

So you'll get an output similar to http://localhost:8080/remote?codici=codici1&codici=codici2&codici=codici3given that codicilist contains codici1, codici2, codici3

所以,你会得到类似的输出HTTP://本地主机:8080 /远程codici = codici1&codici = codici2&codici = codici3因为codici列表中包含codici1codici2codici3