Как избежать экранирования параметра запроса WebTarget? - PullRequest
0 голосов
/ 30 октября 2018

Я хочу отключить кодировку URL для запросов Джерси или для определенных параметров.

Сервер, о котором я говорю, тоже требует формат example.com/path?query=foo:bar

с Джексоном 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 голосов
/ 30 октября 2018

Я понял: решение состоит в том, чтобы использовать фильтр запросов, как описано в Расширенные возможности клиентского 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
...