我试图访问类似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);
}
还有其他选择吗?
答案 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;
}