J'essaie d'accéder à une ressource avec comme http://192.168.1.64:5050/api/{api_key}/updater.info
.
Comment définir dynamiquement le api_key
paramètre? J'ai essayé d'utiliser un RequestInterceptor
sans succès où l'url de base est http://192.168.1.64:5050/api/{api_key}
.
@Override
public void intercept(RequestFacade request) {
request.addPathParam("api_key", apiKey);
}
Y a-t-il d'autres alternatives?
Le remplacement du chemin ne se produit pas à l'intérieur de l'URL de base du point de terminaison API, uniquement la chaîne d'URL relative sur la méthode. Je vais supposer que vous ne voulez pas préfixer les URL relatives sur chacune de vos déclarations de méthode d'interface.
Bien que mal formulé, le javadoc de Endpoint
déclare:
Les appelants doivent toujours consulter l'instance pour les dernières valeurs plutôt que de mettre en cache les valeurs renvoyées.
Cela signifie que pour chaque requête, l'instance Endpoint
sera consultée pour la valeur de l'URL de base.
Vous pouvez fournir une implémentation Endpoint
personnalisée sur laquelle vous pouvez modifier la valeur de la clé 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;
}
}
Utilisez ceci:
@PUT("/path1/path2/{userId}")
void getSomething(
@Path("userId") String userId
);
et vous appelez la méthode comme ceci:
String userId = "1234";
service.getSomething(userId);
Si le paramètre de chemin d'accès n'est pas à la même position dans l'URL pour chaque demande, par exemple, http://endpoint/blah/{apiKey}
et http://endpoint/blah/blah/{apiKey}/blah
, vous pouvez effectuer les opérations suivantes.
Dans votre interface APIService
@GET(/blah/{apiKey})
void getFoo(Callback<Object> callback);
@GET(/blah/blah/{apiKey}/blah)
void getFooBlah(Callback<Object> callback);
Ensuite, dans votre classe ApiClient, créez un 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;
}