改造中的动态路径

时间:2014-04-24 20:22:05

标签: android rest httprequest retrofit

我试图访问类似http://192.168.1.64:5050/api/{api_key}/updater.info的资源。

如何动态设置api_key参数?我尝试使用RequestInterceptor但未成功,其中基本网址为http://192.168.1.64:5050/api/{api_key}

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

还有其他选择吗?

3 个答案:

答案 0 :(得分:29)

使用此:

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

你打电话给这样的方法:

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

答案 1 :(得分:15)

路径替换不会发生在API端点的基本URL内,只会发生在方法上的相对URL字符串。我将假设您不希望在每个接口方法声明上添加相对URL前缀。

虽然措辞不佳,Endpoint的javadoc声明:

  

调用者应始终查询实例以获取最新值,而不是缓存返回的值。

这意味着对于每个请求,将查询Endpoint实例以获取基本URL的值。

您可以提供自定义Endpoint实施,您可以在其中更改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;
  }
}

答案 2 :(得分:3)

例如,如果路径参数不在每个请求的url中的相同位置, http://endpoint/blah/{apiKey}http://endpoint/blah/blah/{apiKey}/blah,您可以执行以下操作。

在您的APIService界面

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

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

然后在您的ApiClient类中创建一个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;
}