Динамические пути в дооснащении

Я пытаюсь получить доступ к ресурсу с помощью http://192.168.1.64:5050/api/{api_key}/updater.info.

Как бы я динамически установил параметр api_key? Я пробовал использовать RequestInterceptor без успеха, где базовый url - http://192.168.1.64:5050/api/{api_key}.

@Override
public void intercept(RequestFacade request) {
    request.addPathParam("api_key", apiKey);
}

Есть ли другие альтернативы?

Ответ 1

Замена пути не происходит внутри базового URL-адреса конечной точки API, а только относительная строка URL-адреса метода. Я собираюсь предположить, что вы не хотите префикс относительных URL-адресов для каждой из объявлений вашего интерфейса.

В то время как плохо сформулированный, javadoc Endpoint утверждает:

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

Это означает, что для каждого запроса будет обработан экземпляр Endpoint для значения базового URL.

Вы можете предоставить пользовательскую реализацию Endpoint, в которой вы можете изменить значение ключа API:

public final class FooEndpoint implements Endpoint {
  private static final String BASE = "http://192.168.1.64:5050/api/";

  private String url;

  public void setApiKey(String apiKey) {
    url = BASE + apiKey;
  }

  @Override public String getName() {
    return "default";
  }

  @Override public String getUrl() {
    if (url == null) throw new IllegalStateException("API key not set.");
    return url;
  }
}

Ответ 2

Используйте это:

@PUT("/path1/path2/{userId}")
void getSomething(
        @Path("userId") String userId
);

и вы вызываете метод следующим образом:

String userId = "1234";
service.getSomething(userId);

Ответ 3

Если параметр пути не находится в одном и том же положении в URL-адресе для каждого запроса, например, http://endpoint/blah/{apiKey} и http://endpoint/blah/blah/{apiKey}/blah, вы можете сделать следующее.

В вашем интерфейсе APIService

    @GET(/blah/{apiKey})
    void getFoo(Callback<Object> callback);

    @GET(/blah/blah/{apiKey}/blah)
    void getFooBlah(Callback<Object> callback);

Затем в вашем классе ApiClient создайте RequestInterceptor

private static APIService sAuthorizedApiService;
private static Gson gson;

static {
    gson = new GsonBuilder().setPrettyPrinting()
            .create();
}


public static synchronized APIService getApiClient(final Context context) {
    if (sAuthorizedApiService == null) {
        RequestInterceptor requestInterceptor = new RequestInterceptor() {
            @Override
            public void intercept(RequestFacade request) {
                request.addPathParam("apiKey", DataProvider.getInstance(context).getApiKey();
            }
        };

        RestAdapter restAdapter = new RestAdapter.Builder().setLogLevel(RestAdapter.LogLevel.FULL)
                .setClient(new OkClient(new OkHttpClient()))
                .setEndpoint("http://endpoint")
                .setRequestInterceptor(requestInterceptor)
                .setConverter(new GsonConverter(gson))
                .build();
        sAuthorizedApiService = restAdapter.create(GMAuthorizedApiService.class);
    }
    return sAuthorizedApiService;
}