2014-04-24 16 views
15

Próbuję uzyskać dostęp do zasobu z podobnym kodem: http://192.168.1.64:5050/api/{api_key}/updater.info.Dynamic Paths in Retrofit

Jak ustawić dynamicznie parametr api_key? Próbowałem używać RequestInterceptor bez powodzenia, gdzie bazowy adres URL to http://192.168.1.64:5050/api/{api_key}.

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

Czy są jeszcze jakieś alternatywy?

Odpowiedz

14

Wymiana ścieżki nie występuje w podstawowym adresie URL punktu końcowego interfejsu API, a jedynie względny ciąg adresu URL w metodzie. Zakładam, że nie chcesz poprzedzać względnych adresów URL na każdej deklaracji metody interfejsu.

Chociaż źle sformułowane, Javadoc z Endpoint stanach:

Dzwoniący należy zawsze skonsultować instancję dla najnowszych wartości zamiast buforowanie zwróconych wartości.

Oznacza to, że na każde żądanie instancja Endpoint będzie konsultowany na wartości podstawowego adresu URL.

Można dostarczyć wdrożenie niestandardowych Endpoint na którym można zmienić wartość klucza 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; 
    } 
} 
+0

Czy możesz rzucić okiem na moją próbę [adresowania wielu punktów końcowych interfejsu API] (http://stackoverflow.com/questions/27399633/how-to-address-multiple-api-end-points-using-retrofit)? – JJD

2

Jeśli parametr ścieżka nie jest w tej samej pozycji w URL dla każdego żądania, na przykład, http://endpoint/blah/{apiKey} i http://endpoint/blah/blah/{apiKey}/blah, możesz wykonać następujące czynności.

w interfejsie APIService

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

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

Następnie w swojej klasie ApiClient utworzyć w 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

użyj:

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

i wywołać metodę tak:

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