2014-04-24 18 views
15

Sto tentando di accedere a una risorsa con tipo http://192.168.1.64:5050/api/{api_key}/updater.info.Percorsi dinamici in retrofit

Come impostare dinamicamente il parametro api_key? Ho provato a utilizzare uno RequestInterceptor senza successo dove l'URL di base è http://192.168.1.64:5050/api/{api_key}.

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

Ci sono altre alternative?

risposta

14

La sostituzione del percorso non avviene all'interno dell'URL di base dell'endpoint API, solo la stringa URL relativa sul metodo. Presumo che tu non voglia anteporre gli URL relativi a ciascuna delle dichiarazioni dei tuoi metodi di interfaccia.

Mentre mal formulata, il javadoc di Endpoint stati:

chiamanti dovrebbe sempre consultare l'istanza per gli ultimi valori piuttosto che la memorizzazione nella cache i valori restituiti.

Ciò significa che per ogni richiesta l'istanza Endpoint verrà consultata per il valore dell'URL di base.

È possibile fornire un'implementazione personalizzata Endpoint su cui è possibile cambiare l'API valore chiave:

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; 
    } 
} 
+0

Ti piace dare un'occhiata al mio tentativo di [affrontare più punti finali dell'API] (http://stackoverflow.com/questions/27399633/how-to-address-multiple-api-end-points-using-retrofit)? – JJD

2

Se il parametro percorso non è nella stessa posizione nel URL per ogni richiesta, ad esempio, http://endpoint/blah/{apiKey} e http://endpoint/blah/blah/{apiKey}/blah, si potrebbe fare quanto segue.

nell'interfaccia APIService

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

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

Poi nella classe ApiClient creare una 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; 
} 
24

Utilizzare questa:

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

e si chiama il metodo come questo:

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