Модификации и символьные символы в PATH
Я столкнулся с проблемой с Retrofit и хотел бы найти подходящий ответ, поскольку единственный способ, которым я могу думать об этом, довольно уродлив и непрактичен.
Для аннотации дооснащения PATH требуется "/" в начале (как вы можете прочитать в этом коде, извлеченном из источника библиотеки:
/** Loads {@link #requestUrl}, {@link #requestUrlParamNames}, and {@link #requestQuery}. */
private void parsePath(String path) {
if (path == null || path.length() == 0 || path.charAt(0) != '/') {
throw methodError("URL path \"%s\" must start with '/'.", path);
}
Проблема, с которой я столкнулась, состоит в том, что часть PATH исходит из бэкэнда в объекте ответа, что означает, что все строки PATH уже отформатированы из бэкенда ранее в другом ответе следующим образом:
Object : {
href: "/resources/login..."
}
Как вы можете видеть, при включении чего-то подобного URL-адрес получает неверный результат:
@GET("{/loginHref}")
void login(@EncodedPath("loginHref") String loginHref,
Callback<User> callback);
к чему-то вроде http://mybaseurl.com//resources/login" * double//перед ресурсами
Это может определенно вызвать проблемы в некоторых конечных точках, и я не могу представить себе простой способ решить эту проблему, кроме как сделать что-то вроде:
a) Измените мою собственную версию модификации, чтобы удалить эту проверку/проверку персонажа (это последнее средство)
b) Утрируйте href перед использованием метода из интерфейса (который я хотел бы избежать любой ценой, а также добавил бы ненужное преобразование по всему месту.
c) Перехватите запрос и правильно сформируйте URL-адрес в случае возникновения этого сценария (действительно, уродливое решение также).
Любая идея, предложения?
Спасибо!
Ответы
Ответ 1
Я думаю, эта ссылка поможет вам Замена пути
Ваша новая реализация будет выглядеть следующим образом.
@GET("/")
void login(Callback<User> callback);
Вы можете предоставить пользовательскую реализацию конечной точки, на которой вы можете изменить относительный путь.
public final class CustomEndpoint implements Endpoint {
private static final String BASE = "http://192.168.1.64:5050/api/";
private String url;
private String href;
public CustomEndpoint(String href){
this.href = href;
url = BASE + this.href;
}
@Override public String getName() {
return "default";
}
@Override public String getUrl() {
if (url == null) throw new IllegalStateException("relative path not set.");
return url;
}
}
Использование выглядит следующим образом
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(new CustomEndPoint(object.href));
then restadapter.create........
Надеюсь, это поможет вам.