Retrofit的动态Endpoint

泡在网上的日子 / 文 发表于2015-11-11 00:13 次阅读 Retrofit

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

收藏 赞 (3) 踩 (1)
上一篇:在Android 6.0 设备上动态获取权限
众所周知,Android 6.0 相比之前的Android版本有一个很大的不同点,就是动态获取权限。今天自己在做拨号功能时,正巧遇到这个问题, 顺手记录下在Android 6.0 上如何动态获取权限。 下面从自己一开始的问题入手 实现拨号功能 说到拨号,一个 Intent 就搞定,
下一篇:如何实现携程动态加载插件中对aapt的改造
前几天,携程无线部门开源了他们的 插件框架 ,使用该框架可以方便的实现app的插件化开发和热更新。 在陈博士发表的关于该框架的 blog 中,有这么一段 为aapt增加–apk-module参数。如前所述,资源ID其实有一个PackageID的内部字段。我们为每个插件工程指定