【问题标题】:Changing baseUrl dynamically using retrofit & dagger2使用改造和 dagger2 动态更改 baseUrl
【发布时间】:2017-08-18 08:02:53
【问题描述】:

我正在为我的应用程序使用改造和 Dagger2。我想根据用户在 Spinner 中选择的内容动态更改应用程序的 baseUrl。

在互联网上花了几个小时后,我得出结论,可以动态更改 baseUrl。

依赖注入看起来像这样:

APiModule

  @Module
public class ApiModule {

 String mBaseUrl;

    public ApiModule(String mBaseUrl) {
        this.mBaseUrl = mBaseUrl;
    }

@Provides
    @Singleton
    OkHttpClient provideOkhttpClient(Cache cache) {
        OkHttpClient.Builder client = new OkHttpClient.Builder();           
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        // set your desired log level
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        client.addInterceptor(logging);
        client.cache(cache);
        return client.build();   
    }

    @Provides
    @Singleton
    Retrofit provideRetrofit(OkHttpClient okHttpClient) {
        return new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build();
    }
}

我根据来自互联网的参考创建了一个额外的类

HostSelectionInterceptor.java

import java.io.IOException;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
/** An interceptor that allows runtime changes to the URL hostname. */
@Module(includes = {ApiModule.class})
public final class HostSelectionInterceptor implements Interceptor {
    private volatile String host;

    @Provides
    @Singleton
    public String setHost(String host) {
        this.host = host;
        return this.host;
    }

    public String getHost() {
        return host;
    }

    @Provides
    @Singleton
    @Override
    public okhttp3.Response intercept(Chain chain) {
        Request request = chain.request();
        String  host    = getHost();
        if (host != null) {
           /* HttpUrl newUrl = request.url().newBuilder()
                    .host(host)
                    .build();*/
            HttpUrl newUrl = HttpUrl.parse(host);
            request = request.newBuilder()
                    .url(newUrl)
                    .build();
        }
        try {
            return chain.proceed(request);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

现在,我的问题是如何在更改 Spinner 时使用 HostSelectionInterceptor 更改我的 baseUrl。

【问题讨论】:

标签: java android retrofit2 dagger-2


【解决方案1】:

您可以使用@Named(或使用@Qualifier 注解的自定义注解) 添加如下注释:

@Singleton
@Provides
@Named("picture")
Retrofit providePictureRetrofit(GsonConverterFactory gsonConverterFactory, RxJavaCallAdapterFactory rxJavaCallAdapterFactory) {
    return retrofit = new Retrofit.Builder()
            .baseUrl(MarsWeatherWidget.PICTURE_URL) // one url
            .build();
}



@Singleton
@Provides
@Named("weather")
Retrofit provideWeatherRetrofit(GsonConverterFactory gsonConverterFactory, RxJavaCallAdapterFactory rxJavaCallAdapterFactory) {
    return retrofit = new Retrofit.Builder()
            .baseUrl(MarsWeatherWidget.WEATHER_URL) // other url
            .build();
}

注入合格版本

当你的模块提供了限定类型时,你只需要在你需要依赖的地方添加限定符。

MyPictureService provideService(@Named("picture") Retrofit retrofit) {
    // ...
}

【讨论】:

    【解决方案2】:

    Request.Builder.url - 是一个请求 URL。所以这是添加到 Base_URL 的所有内容。

    要动态更改基本 url,您必须重新创建改造对象。

    查看我一直在开发的模拟服务器: https://github.com/macieknajbar/MockServer/blob/master/app/src/main/java/com/example/mockserver/rest/server/MockServer.kt

    运行测试并进行更改以供您自己使用(以替换基本 url,而不仅仅是响应)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 2021-09-27
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多