Dynamic Paths in Retrofit

后端 未结 3 1463
情书的邮戳
情书的邮戳 2020-12-06 09:18

I\'m trying to access a resource with like http://192.168.1.64:5050/api/{api_key}/updater.info.

How would I dynamically set the api_key par

相关标签:
3条回答
  • 2020-12-06 10:00

    Path replacement does not happen inside the base URL of the API endpoint, only the relative URL string on the method. I'm going to assume you don't want to prefix the relative URLs on every one of your interface method declarations.

    While poorly worded, the javadoc of Endpoint states:

    Callers should always consult the instance for the latest values rather than caching the returned values.

    This means that for every request the Endpoint instance will be consulted for the value of the base URL.

    You can supply a custom Endpoint implementation on which you can change the API key value:

    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 讨论(0)
  • 2020-12-06 10:09

    If the path parameter is not in the same position in the url for each request, for example, http://endpoint/blah/{apiKey} and http://endpoint/blah/blah/{apiKey}/blah, you could do the following.

    In your APIService Interface

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

    Then in your ApiClient Class create a 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;
    }
    
    0 讨论(0)
  • 2020-12-06 10:11

    Use this:

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

    and you call the method like this:

    String userId = "1234";
    service.getSomething(userId);
    
    0 讨论(0)
提交回复
热议问题