Retrofit的动态Endpoint
原文: Dynamic Endpoints with Retrofit
我在Ward工作,Ward是一个关于 英雄联盟 的安卓app。开发的过程中,在使用Riot Games的API的时候我遇到了一个问题。它们的域名在不同的地区是不同的,比如北美(https://na.api.pvp.net),西欧(https://euw.api.pvp.net), 等等。
在看了StackOverflow上的提示之后( 这里 和 这里),我发现Retrofit可以通过实现自定义的Endpoint类来支持多个endpoint url。我为英雄联盟 API 实现的类如下:
public final class RiotEndpoint implements Endpoint {
private static final String PROTOCOL = “https://”;
private static final String BASE = “.api.pvp.net”;
private String url;
private String mRegion;
public void setRegion(String region) {
mRegion = region;
url = PROTOCOL + mRegion + BASE;
}
@Override
public String getName() {
return mRegion;
}
@Override
public String getUrl() {
if (url == null) {
throw new IllegalStateException(“Illegal URL.”);
}
return url;
}
}
这里是从我的RiotClient类截取的几行相关代码:
...
private static RiotEndpoint mEndpoint = new RiotEndpoint();
...
public static RiotService getClient(String region) {
mEndpoint.setRegion(region);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(mEndpoint)
.build();
return restAdapter.create(RiotService.class);
}
...
这允许调用者在调用api之前传递构建正确URL的地区字符串。这里是 Ward 中其中一个fragment 的使用方法:
RiotClient.getClient(region)
.listSummonersByNames(region, name, this);
希望能对使用Retrofit处理动态域名的朋友有用。