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}
.
- Analizar manualmente parte de una respuesta al utilizar Retrofit
- Análisis de JSON con Retrofit
- RxJava y Retrofit2: NetworkOnMainThreadException
- Retrofit POST con un objeto json que contiene parámetros
- Retrofit 2.0 lanzando "IllegalArgumentException: los parámetros @Field solo se pueden usar con la codificación de formularios". ¿Cómo hacer la consulta correcta de la API y arreglarlo?
@Override public void intercept(RequestFacade request) { request.addPathParam("api_key", apiKey); }
¿Hay otras alternativas?
- Android: Sondeo de un servidor con Retrofit
- Agregar cabecera a todas las solicitudes con Retrofit 2
- Desmontaje de desmontaje de Retrofit + GSON
- Uso de la biblioteca de actualización cuadrada para realizar solicitudes http
- Retrofit 2: responseBodyConverter convierte a objeto nulo
- Broken Pipe al intentar cargar una actualización de archivo grande 2
- Descargar vídeo de Url con Retrofit
- ¿Cómo configurar el nivel de registro de depuración y liberación para Retrofit?
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; }
- Advertencia de pelusa Extraña – Texto inesperado encontrado en el archivo de diseño: ""
- Análisis de una matriz de objetos JSON utilizando Jackson 2.0