我想为Jersey请求或某些参数关闭URL编码。
我在说的服务器也需要example.com/path?query=foo:bar
使用Jackson WebTarget,
final WebTarget target = ClientBuilder.newClient()
.target(url)
.queryParam("query", "{queryVal}")
.resolveTemplate("queryVal", "foo:bar");
不幸的是,这会产生example.com/path?query=foo bar
,服务器无法接受。
我为此进行了很多搜索,唯一有前途的途径似乎与javax.ws.rs.core.Configuration
有关,但是我还没有走远。
答案 0 :(得分:0)
我发现了:解决方案是使用Advanced Features of the Client API
中记录的请求过滤器final WebTarget target = ClientBuilder.newClient()
.target(url)
.queryParam("query", "{queryVal}")
.resolveTemplate("queryVal", "foo:bar")
.register(Filter.class)
然后我们有
@Provider
public class Filter implements ClientRequestFilter {
private static final Logger logger = LoggerFactory.getLogger(Filter.class);
@Override
public void filter(ClientRequestContext ctx) throws IOException {
try {
logger.debug("Before: {}", ctx.getUri());
//this is gonna get ugly
ctx.setUri(new URI(
URLDecoder.decode(ctx.getUri().toString(), StandardCharsets.UTF_8.toString())));
logger.debug("After: {}", ctx.getUri());
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
输出:
com.example.client.Filter : Before: http://example.com/path?query=foo%3Abar
com.example.client.Filter : After: http://example.com/path?query=foo:bar