UriBuilder中大括号和空格的编码问题



我使用UriBuildercom.sun.jersey.api.uri.UriBuilderImpl实现来编码URL(版本1.19(。当我的URL的查询参数同时包括花括号和空格时,就会出现问题。

示例:

UriBuilder uriBuilder = fromUri("www.something.com")
.queryParam("q", "{some thing}");
return uriBuilder.build().toString();

此操作失败:

javax.ws.rs.core.UriBuilderException: java.net.URISyntaxException: Illegal character in query at index 27: www.something.com?q=%7Bsome thing%7D

这很有趣,好像我去掉了花括号,我得到了预期的编码:www.something.com?q=some+thing。。。

正如我所期望的,org.apache.http.client.utils.URIBuilder对其进行编码,即:www.something.com?q=%7Bsome+thing%7D

我试过这样做:

...
.queryParam("q", UriComponent.encode(searchQuery, UriComponent.Type.QUERY_PARAM)).
.build();

但随后空间字符也被编码为www.something.com?q=%7Bsome%2Bthing%7D

我必须做些什么才能获得www.something.com?q=%7Bsome+thing%7D

我使用的是jersey客户端v1.9.1,您的代码运行时没有错误。

这是我的专业依赖:

<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.9.1</version>
</dependency>

和java代码:

import java.net.URI;
import javax.ws.rs.core.UriBuilder;
public class Main {
public static void main(String[] args) throws Exception {
try {
URI url = UriBuilder.fromUri("www.something.com")
.queryParam("q", "{some thing}")
.build();
System.out.println(url);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

输出:www.something.com?q=%7Bsome+thing%7D

更新

花括号是v1.19失败的原因(请参阅文档(

以下是v1.19:的工作版本

URI url = UriBuilder.fromPath("www.something.com")
.queryParam("q", "{value}")
.build("{some thing}", "value");
System.out.println(url);

您可以尝试以下操作:你需要两个图书馆jersey-core-1.19.2javax.ws.rs以及jersey-client-1.19.2TR

public class ClassTest {
public static void main(String[] args) throws UnsupportedEncodingException {
String queryString =  URLEncoder.encode("{some thing}", "UTF-8");
System.out.println(queryString);
URI uri = UriBuilder.fromUri("www.something.com")
.queryParam("q", queryString)
.build();
String url = uri.toString().replace("%2B", "+");
System.out.println(url);
}
}

最新更新