web-dev-qa-db-fra.com

Chemins dynamiques en rénovation

J'essaie d'accéder à une ressource avec comme http://192.168.1.64:5050/api/{api_key}/updater.info.

Comment définir dynamiquement le api_key paramètre? J'ai essayé d'utiliser un RequestInterceptor sans succès où l'url de base est http://192.168.1.64:5050/api/{api_key}.

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

Y a-t-il d'autres alternatives?

23
f2prateek

Le remplacement du chemin ne se produit pas à l'intérieur de l'URL de base du point de terminaison API, uniquement la chaîne d'URL relative sur la méthode. Je vais supposer que vous ne voulez pas préfixer les URL relatives sur chacune de vos déclarations de méthode d'interface.

Bien que mal formulé, le javadoc de Endpoint déclare:

Les appelants doivent toujours consulter l'instance pour les dernières valeurs plutôt que de mettre en cache les valeurs renvoyées.

Cela signifie que pour chaque requête, l'instance Endpoint sera consultée pour la valeur de l'URL de base.

Vous pouvez fournir une implémentation Endpoint personnalisée sur laquelle vous pouvez modifier la valeur de la clé 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;
  }
}
16
Jake Wharton

Utilisez ceci:

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

et vous appelez la méthode comme ceci:

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

Si le paramètre de chemin d'accès n'est pas à la même position dans l'URL pour chaque demande, par exemple, http://endpoint/blah/{apiKey} et http://endpoint/blah/blah/{apiKey}/blah, vous pouvez effectuer les opérations suivantes.

Dans votre interface APIService

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

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

Ensuite, dans votre classe ApiClient, créez 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;
}
3
Jessy Conroy