Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Используйте его следующим образом:

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

Ответ 2

Так как @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, ..);

Ответ 3

Известны ошибки, и вы можете посмотреть bugreport: Дооснащение @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, ..);

Привет