Заменить общие параметры пути в модификации 2 с помощью okhttp

У меня есть некоторые служебные URL-адреса с тем же baseUrl. Для некоторых URL-адресов будут использоваться некоторые распространенные используемые параметры, например apiVersion или locale. Но они не обязательно должны быть в каждом URL-адресе, поэтому я не могу добавить их в baseUrl.

.../api/{apiVersion}/{locale}/event/{eventId}
.../api/{apiVersion}/{locale}/venues
.../api/{apiVersion}/configuration

Я не хочу добавлять эти параметры в модифицированный интерфейс. В retrofit 1 я сделал перехватчик и использовал RequestFacade.addPathParam(..., ...) для заполнения этих общих параметров пути для каждого URL.

Для модификации 2 я не могу найти подходящий способ сделать это с помощью okhttp. Единственный способ, которым я вижу это сейчас, - получить HttpUrl от Chain.request().httpUrl(); в okhttp Interceptor и сам манипулировать этим, но я не знаю, будет ли это лучший способ.

Кто-нибудь может найти лучший способ заменить параметры пути в okhttp Interceptor?

На момент написания я использую модификацию: 2.0.0-beta2 и okhttp: 2.7.2.

Ответ 1

Для модификации 2 я не могу найти подходящий способ сделать это с помощью okhttp. Единственный способ, которым я вижу это сейчас, - это получить HttpUrl из Chain.request(). HttpUrl(); в перехватчике okhttp и самостоятельно манипулируйте этим, но я не знаю, является ли это лучшим способом идти.

Моя реализация с использованием okhttp: 3.2

    class PathParamInterceptor implements Interceptor {
        private final String mKey;
        private final String mValue;

        private PathParamInterceptor(String key, String value) {
            mKey = String.format("{%s}", key);
            mValue = value;
        }

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request originalRequest = chain.request();

            HttpUrl.Builder urlBuilder = originalRequest.url().newBuilder();
            List<String> segments = originalRequest.url().pathSegments();

            for (int i = 0; i < segments.size(); i++) {
                if (mKey.equalsIgnoreCase(segments.get(i))) {
                    urlBuilder.setPathSegment(i, mValue);
                }
            }

            Request request = originalRequest.newBuilder()
                    .url(urlBuilder.build())
                    .build();
            return chain.proceed(request);
        }
    }