我正在尝试找到一种方法来解析URL,对其进行解码并以明确的方式返回已解码的组件。
URLDecoder不合适,因为它可能会返回不明确的字符串,例如
URLDecoder.decode("http://www.google.com?q=abc%26def", "UTF-8")
返回:
http://www.google.com?q=abc&def
所以关于逃脱的信息&失去了。
我希望有类似的东西:
DecodedUrlComponents cmp = GreatURLDecoder.decode(url);
Map<String, List<String>> decodedQuery = cmp.getQuery();
decodedQuery.get("q").get(0); //returns "abc&def"
我如何做到这一点?
编辑: 感谢您的回复,但我的问题有点不同:我希望以明确的方式获得已解码的组件,因此以下任何一项都不能满足我的需求:
new URI("http://www.google.com?q=abc%26def").getRawQuery()
返回已编码的查询:q=abc%26def
new URI("http://www.google.com?q=abc%26def").getQuery()
返回不明确的值:q=abc&def
URLDecoder.decode("http://www.google.com?q=abc%26def", "UTF-8")
返回不明确的值:http://www.google.com?q=abc&def
org.springframework.web.util.UriComponentsBuilder.fromUriString("http://www.google.com?q=abc%26def").build(true).getQueryParams()
- 关闭,但仍然不是我想要的,因为它会返回编码参数的地图:{q=[abc%26def]}
答案 0 :(得分:2)
使用spring框架(org.springframework.web.util),您可以执行以下操作:
URI uri = <your_uri_here>;
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUri(uri);
UriComponents uriComponents = uriComponentsBuilder.build();
String path = uriComponents.getPath();
MultiValueMap<String, String> queryParams = uriComponents.getQueryParams(); //etc.
答案 1 :(得分:1)
例如,您可以使用javax.ws.rs.core.UriInfo
的实现。一个例子是org.jboss.resteasy.spi.ResteasyUriInfo
。如果你正在使用maven,你只需要在pom.xml中添加以下内容:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.6.Final</version>
</dependency>
然后下面的代码应该做你想要的:
UriInfo ui = new ResteasyUriInfo(new URI("http://www.google.com?q=abc%26def"));
List<String> qValues = ui.getQueryParameters().get("q");
for (String q : qValues) {
System.out.println(q);
}
答案 2 :(得分:0)
从您的网址字符串生成java.net.URL
,然后使用url.getQuery()
,url.getProtocol()
,url.getHost()
等方式等等 - 它就在那里。
答案 3 :(得分:0)
使用以下内容:
String url = "http://www.google.com?test=34%3fg";
URL testUrl = new java.net.URL(url);
System.out.println(testUrl.getQuery());
打印测试= 34%3fg。
答案 4 :(得分:0)
URLDecoder
不会将您的URL拆分为组件,它只是将其String表示转换为特定格式,正如它的JavaDoc及其签名所暗示的那样,它返回一个String。正如其他人所提到的,你应该只从你的字符串构造一个URL
对象,它暴露了你需要的所有功能。请参阅here。