如何避免转义WebTarget查询参数?

时间:2018-10-30 19:01:13

标签: java java-8 request jersey urlencode

我想为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有关,但是我还没有走远。

1 个答案:

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