Java 如何正确地从URL字符串中按名称提取查询参数?

Java 如何正确地从URL字符串中按名称提取查询参数?,java,Java,我正试图找到一个Java库,用于所有用途的URI/URL提取和操作,就像我在许多其他语言中看到的那样 我见过的很多java代码都使用手动字符串拆分/连接/串联,偶尔使用urlcoder.encode()/urldecode.decode()。这会导致不安全的代码 我认为这两个竞争者是Spring的UriComponentsBuilder和apache的URIBuilder。但我看不出这两种方法都允许我从URL提取查询参数,这是一种常见的用例 我正在尝试使用与此Javascript类似的Java:

我正试图找到一个Java库,用于所有用途的URI/URL提取和操作,就像我在许多其他语言中看到的那样

我见过的很多java代码都使用手动字符串拆分/连接/串联,偶尔使用
urlcoder.encode()
/
urldecode.decode()
。这会导致不安全的代码

我认为这两个竞争者是Spring的
UriComponentsBuilder
和apache的
URIBuilder
。但我看不出这两种方法都允许我从URL提取查询参数,这是一种常见的用例

我正在尝试使用与此Javascript类似的Java:

let url=新url(“http://foobar/path")
url.searchParams.set(“param1”,“a=b”)
//请确保将其正确编码为param1=a%3Db
console.log(url)
//印刷品:http://foobar/path?param1=a%3Db
//并再次正确解码为a=b
log(新URL(URL.toString()).searchParams.get(“param1”))
//打印:“a=b”
UriComponentsBuilder
有一个
build().getQueryParams().getFirst(“param1”)
方法,但它不解码参数,
URIBuilder
要求我自己搜索参数列表,而不是最简单的API

我感到震惊的是,我找不到一个Java库来提供URL字符串的所有常见提取和操作方法。我错过什么了吗

下面是一些测试代码,演示了我的发现:

包javademo;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.utils.URIBuilder;
导入org.junit.jupiter.api.Test;
导入org.springframework.web.util.Uri组件;
导入org.springframework.web.util.UriComponentsBuilder;
导入java.net.URISyntaxException;
导入java.util.List;
导入静态org.junit.jupiter.api.Assertions.*;
公共类TestUriComponents{
@试验
public void testUriComponentsBuilder(){
资产质量(“a”、“a”);
UriComponentsBuilder;
//让我们构建一个参数值为a=b的字符串(需要编码)
builder=UriComponentsBuilder.fromHttpUrl(“http://foobar/path");
builder.queryParam(“参数1”,“a=b”);
String encodedURL=builder.build().encode().toUriString();
System.out.println(encodedURL);
//现在让我们再次从该URL提取param1
builder=UriComponentsBuilder.fromHttpUrl(encodedURL);
UriComponents=builder.build().encode();
//此**失败**。getQueryParams()不解码值…真的吗???
assertEquals(“a=b”,components.getQueryParams().getFirst(“param1”);
//然而,这确实过去了(但从未实现)。。。
assertEquals(“a%253Db”,components.getQueryParams().getFirst(“param1”);
}
@试验
public void testURIBuilder()引发URISyntaxException{
URIBuilder=新的URIBuilder(“/foobar/path”);
builder.addParameter(“param1”,“a=b”);
字符串encodedURL=builder.build().toString();
System.out.println(encodedURL);
生成器=新的URIBuilder(encodedURL);
//真的吗?我必须自己搜索列表?真的吗???
列出queryParams=builder.getQueryParams();
对于(NameValuePair qp:queryParams){
System.out.println(String.format(“%s:%s”、qp.getName()、qp.getValue());
if(qp.getName().equals(“param1”))
assertEquals(“a=b”,qp.getValue());
}
}
}

这有帮助吗?您可以从Java调用JavaScript。这是一个可行的选择吗?@Peter我想,你会在Angel Koh提供的链接上找到解决方案。@AngelKoh:哦,不。看看你所指的问题,证实了我所有最担心的事情。有些解决方案是人们自己编写解决方案,有些解决方案是使用UriComponentsBuilder编写的,这些解决方案的值不会被解码-(你写了“通用URI/URI提取和操作”。你是说“URI/URL”吗?