如何解析和解码Java中的URI到URI组件?

时间:2015-03-17 10:20:32

标签: java url decode

我正在尝试找到一种方法来解析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]}

5 个答案:

答案 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