2014-04-24 2 views
15

Ich versuche auf eine Ressource mit wie http://192.168.1.64:5050/api/{api_key}/updater.info zugreifen. Wie würde ich den api_key Parameter dynamisch setzen? Ich habe versucht, eine RequestInterceptor ohne Erfolg zu verwenden, wo die Basis-URL http://192.168.1.64:5050/api/{api_key} ist.Dynamische Pfade in Retrofit

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

Gibt es noch andere Alternativen?

Antwort

14

Die Pfadersetzung findet nicht innerhalb der Basis-URL des API-Endpunkts statt, sondern nur die relative URL-Zeichenfolge der Methode. Ich gehe davon aus, dass Sie die relativen URLs nicht bei jeder Ihrer Interface-Methodendeklarationen voranstellen möchten.

Während schlecht formuliert, die javadoc von Endpoint Staaten:

Anrufer sollte immer die Instanz für die neuesten Werte konsultieren, anstatt die zurückgegebenen Werte Caching.

Dies bedeutet, dass für jede Anfrage die Endpoint Instanz für den Wert der Basis-URL herangezogen wird.

Sie können eine benutzerdefinierten Endpoint Implementierung liefern, auf das Sie den API-Schlüssel Wert ändern können:

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

Haben Sie etwas dagegen, einen Blick auf meinen Versuch [mehrere API-Endpunkte zu adressieren] (http://stackoverflow.com/questions/27399633/how-to-address-multiple-api-end-points-using-retrofit)) – JJD

2

Wenn der Pfad Parameter in der URL für jede Anforderung nicht in der gleichen Position sind, zum Beispiel http://endpoint/blah/{apiKey} und http://endpoint/blah/blah/{apiKey}/blah, könnten Sie Folgendes tun.

In Ihrem APIService Schnittstelle

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

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

Dann in Ihrer ApiClient Klasse erstellen Sie eine 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

verwenden:

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

und rufen Sie die Methode wie folgt:

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