Динамические пути в дооснащении
Я пытаюсь получить доступ к ресурсу с помощью 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;
}