Java 拆分url字符串时,如何使用LinkedHashMap创建键值对?

Java 拆分url字符串时,如何使用LinkedHashMap创建键值对?,java,Java,下面我有一个网址: https://test.com/login/?response_type=code&redirect_uri=https%3A%2F%2Ftest.com&client=testclient&successUrl=https%3A%2F%2Flocalhost%3A4444%2Ftestsite%2Foauth%2Ftestendpoint%3Fresponse_type%3Dcode%26redirect_uri%3Dhttps%253A%252F

下面我有一个网址:

https://test.com/login/?response_type=code&redirect_uri=https%3A%2F%2Ftest.com&client=testclient&successUrl=https%3A%2F%2Flocalhost%3A4444%2Ftestsite%2Foauth%2Ftestendpoint%3Fresponse_type%3Dcode%26redirect_uri%3Dhttps%253A%252F%252Ftest.com%26client%3Dtestclient
我对其进行解码,使其看起来像一个更整洁的url字符串:

 public void testMethod() {

        final String url = URLDecoder.decode(getLastResponse().getHeaders().getFirst("location"), "UTF-8");

}
现在我要做的是将这个url按域分开,查询参数并分配它们。这样我就可以对他们进行断言。我的方法是通过值键对,但我很难理解它的概念

这是我在下面的尝试,但它是一团糟。有人知道我如何使用LinkedHashMap来帮助执行键值对吗?此外,正如您在url中看到的,一些参数出现两次,因此需要帮助检查多个参数

final Map<String, List<String>> query_pairs = new LinkedHashMap<>();
    final String[] pairs = url.split("&|\\?");
    for (String pair : pairs) {
        final int idx = pair.indexOf("=");
        final String key = idx > 0 ? url : pair;
        if (!query_pairs.containsKey(key)) {
            query_pairs.put(key, new LinkedList<>());
        }
        final String value = idx > 0 && pair.length() > idx + 1 ? url : null;
        query_pairs.get(key).add(value);
    }
final Map query_pairs=new LinkedHashMap();
最后一个字符串[]pairs=url.split(&| \?);
for(字符串对:对){
final int idx=pair.indexOf(“=”);
最终字符串键=idx>0?url:pair;
如果(!query_pairs.containsKey(键)){
query_pairs.put(key,newlinkedlist());
}
最终字符串值=idx>0&&pair.length()>idx+1?url:null;
查询对。获取(键)。添加(值);
}

从URL开始,按照注释中提到的其他参考文献中的说明,对参数值进行解码会更容易。下面是一个使用Java流中断url的示例:

public static Map<String, List<String>> split(URL url) {
    return Arrays.stream(url.getQuery().split("&"))
            .map(s -> s.split("="))
            // filter out empty parameter names (as in Tomcat) "?&=&&=value&"
            .filter(arr -> arr.length > 0 && arr[0].length() > 0)
            //.peek(a -> System.out.println(Arrays.toString(a)))
            .collect(Collectors.groupingBy(key -> URLDecoder.decode(key[0], StandardCharsets.UTF_8),
                        LinkedHashMap::new,
                        Collectors.mapping(value -> value.length < 2 ? "" : URLDecoder.decode(value[1], StandardCharsets.UTF_8), Collectors.toList())))
           ;
}
印刷品:

{date=[2020-10-01, 2020-12-31], =[, ], flag=[], arg=[v], flag3=[], source=[somewhere], name1=[val ue1, secondvalue]}
KEYS of name1 =[val ue1, secondvalue]

这回答了你的问题吗?这回答了你的问题吗?
{date=[2020-10-01, 2020-12-31], =[, ], flag=[], arg=[v], flag3=[], source=[somewhere], name1=[val ue1, secondvalue]}
KEYS of name1 =[val ue1, secondvalue]