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处理动态域名的朋友有用。