Модификации и символьные символы в 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........

Надеюсь, это поможет вам.