Замена пути замены: замена по всему пути (включая /)

В моей настройке я получаю все пути для своих ресурсов от REST API от первоначального вызова API. Мы используем этот шаблон, чтобы иметь возможность изменять все пути ресурсов, не нарушая при этом все существующие версии приложений.

Я играл с Retrofit, и я попытался создать метод, который будет принимать любой путь, который я передаю ему как строку. Моя попытка выглядит так:

@GET("/{path}") public FooBar getFooBar(@Path("path") String path); 

Затем я попытаюсь назвать это следующим образом.

 String path = "foo/bar"; api.getFooBar(path); 

К сожалению Retrofit URL-кодирует замену пути, и в итоге я делаю запрос /foo%2Fbar вместо /foo/bar . Есть ли способ отключить кодировку URL-адресов для замены пути или сделать замены, охватывающие несколько сегментов маршрута? К сожалению, я даже не знаю, сколько сегментов пути есть, все контролируется API.

Solutions Collecting From Web of "Замена пути замены: замена по всему пути (включая /)"

Используйте @EncodedPath ! Вот и все. Я скопирую Javadoc, чтобы у этого ответа было больше мяса:

Именованная замена в URL-адресе. Значения преобразуются в строку с использованием String.valueOf(Object) . Значения используются буквально без кодирования URL. См. @Path кодировки @Path для URL.

Используйте его так:

 @GET("/{path}") void example(@EncodedPath("path") String path, ..); 

Поскольку @EncodedPath устарел сейчас

Модернизация 1.9:

 @GET("/{path}") void example(@Path(value = "path", encoded = false) String path, ..); 

Дооснащение 2. *:

 @GET("/{path}") void example(@Path(value = "path", encoded = false) String path, ..); 

Известны ошибки, и вы можете посмотреть bugreport на: Retrofit @Github

Существует также ссылка на возможные решения: Решение @Github

В итоге сообщение от разработчиков-модификаторов:

«Замены пути, которые охватывают несколько сегментов пути, не будут поддерживаться, вы должны использовать @Url для создания полного относительного URL-адреса программно, если количество сегментов пути изменяется динамически».

Поэтому, если у вас проблемы с кодировкой, решение может быть:

Ваш API для GET:

 @GET Call<Object> Function(@Url String path, @Query("CONTENT") String content); 

Ваш API для POST:

 @FormUrlEncoded @POST Call<Object> Function(@Url String path, @Field("CONTENT") String content); 

И вы можете назвать это следующим:

 String thePath = "www.foo.de/foo/foo2"; Call<Object> call = api.Function(thePath,content); 

Таким образом, у вас нет проблемы с кодированием.

Но если вы просто ищете нормальный код в версии 2. * API должен быть таким:

 @GET("/{path}") void example(@Path(value = "path", encoded = false) String path, ..); 

С уважением