Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Rutas dinámicas en la adaptación

Estoy intentando acceder a un recurso con como http://192.168.1.64:5050/api/{api_key}/updater.info .

¿Cómo establecería dinámicamente el parámetro api_key ? He intentado usar un RequestInterceptor sin éxito donde la url de base es http://192.168.1.64:5050/api/{api_key} .

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

¿Hay otras alternativas?

3 Solutions collect form web for “Rutas dinámicas en la adaptación”

El reemplazo de ruta no ocurre dentro de la URL base del punto final de la API, solo la cadena URL relativa en el método. Voy a suponer que no desea prefijar las URL relativas en cada una de sus declaraciones de método de interfaz.

Aunque está mal redactado, el javadoc de Endpoint dice:

Los llamantes siempre deben consultar la instancia de los valores más recientes en lugar de almacenar en caché los valores devueltos.

Esto significa que para cada solicitud se consultará la instancia de Endpoint para el valor de la URL de base.

Puede proporcionar una implementación personalizada de Endpoint en la que puede cambiar el valor de la clave 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; } } 

Utilizar esta:

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

Y se llama al método como este:

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

Si el parámetro path no está en la misma posición en la url de cada solicitud, por ejemplo, http://endpoint/blah/{apiKey} y http://endpoint/blah/blah/{apiKey}/blah , podría Haz lo siguiente.

En su interfaz APIService

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

A continuación, en su clase ApiClient crear 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; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.