Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解析和解码Java到URI组件中的URI?_Java_Url_Decode - Fatal编程技术网

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

如何解析和解码Java到URI组件中的URI?,java,url,decode,Java,Url,Decode,我试图找到一种方法,可以解析URL,对其进行解码,并以明确的方式返回解码后的组件 不适合,因为它可能返回不明确的字符串,例如 URLDecoder.decode("http://www.google.com?q=abc%26def", "UTF-8") 返回: http://www.google.com?q=abc&def 所以关于逃逸的信息丢失了 我想要一些像: DecodedUrlComponents cmp = GreatURLDecoder.decode(url); Map<

我试图找到一种方法,可以解析URL,对其进行解码,并以明确的方式返回解码后的组件

不适合,因为它可能返回不明确的字符串,例如

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"
DecodedUrlComponents cmp=greathledcoder.decode(url);
Map decodedQuery=cmp.getQuery();
decodedQuery.get(“q”).get(0)//返回“abc&def”
我如何做到这一点

编辑: 感谢您的回答,但我的问题有点不同:我希望以明确的方式解码组件,因此以下两项都不是我需要的:

  • 新URI(“http://www.google.com?q=abc%26def“”.getRawQuery()
    返回编码查询:
    q=abc%26def
  • 新URI(“http://www.google.com?q=abc%26defgetQuery()返回不明确的值:
    q=abc&def
  • urldecker.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()
    -close,但仍然不是我想要的,因为它返回编码参数的映射:
    {q=[abc%26def]}

从URL字符串生成一个
java.net.URL
,然后使用
URL.getQuery()
URL.getProtocol()
URL.getHost()
等方法-一切都在这里

使用以下命令:

String url = "http://www.google.com?test=34%3fg";
URL testUrl = new java.net.URL(url);
System.out.println(testUrl.getQuery());
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.

应打印test=34%3fg。

URLDecover
不会将URL拆分为组件,它只是将其字符串表示形式转换为特定格式,如JavaDoc及其签名所示,该签名返回字符串。正如其他人提到的,您应该从字符串构造一个
URL
对象,它公开了您需要的所有功能。请参阅。

例如,您可以使用的实现。一个例子是
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>

org.jboss.resteasy
resteasy jaxrs
3.0.6.1最终版本
然后,以下代码应该执行您想要的操作:

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);
}
UriInfo ui=new ResteasyUriInfo(新URI(“http://www.google.com?q=abc%26def"));
List qValues=ui.getQueryParameters().get(“q”);
for(字符串q:qValues){
系统输出println(q);
}
使用spring框架(org.springframework.web.util),您可以执行以下操作:

String url = "http://www.google.com?test=34%3fg";
URL testUrl = new java.net.URL(url);
System.out.println(testUrl.getQuery());
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.
URI=;
UriComponentsBuilder UriComponentsBuilder=UriComponentsBuilder.fromUri(uri);
UriComponents UriComponents=uriComponentsBuilder.build();
字符串路径=uriComponents.getPath();
MultiValueMap queryParams=uriComponents.getQueryParams()//等

谢谢,它看起来很正常。尽管如此,我对它并不十分满意——仅仅为了解析和解码URL而依赖JAX-RS似乎有些过分,这是相当多的额外内容。您最好只从源代码库复制类并只包含该类。此外,如果您使用Jersey 2而不是用于JAX-RS的RESTEasy,则可以使用
org.glassfish.Jersey.uri.UriComponent.decodeQuery(uri,boolean)
和相关的
decode*
方法。不幸的是,它无法使用百分比编码正确解码查询参数。因此,如果您的URL可能包含查询参数,我建议不要使用它。