【发布时间】:2016-08-14 16:10:15
【问题描述】:
问题
我需要从 USER 输入的域调用 API,并且我需要在调用之前根据插入的数据编辑我的 Retrofit 单例。
有没有办法“重置”我的单例,强制它重新创建?
或
有没有办法在通话前用我的数据(可能在拦截器中?)更新我的baseUrl?
代码
单身人士
@Provides
@Singleton
Retrofit provideRetrofit(SharedPreferences prefs) {
String apiUrl = "https://%1s%2s";
apiUrl = String.format(apiUrl, prefs.getString(ACCOUNT_SUBDOMAIN, null), prefs.getString(ACCOUNT_DOMAIN, null));
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new HeaderInterceptor())
.build();
return new Retrofit.Builder()
.baseUrl(apiUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
@Provides
@Singleton
API provideAPI(Retrofit retrofit) {
return retrofit.create(API.class);
}
API
@FormUrlEncoded
@POST("endpoint")
Observable<Response> logIn(@Field("login") String login, @Field("password") String password);
现在的运作方式
这个想法是在 API 调用之前通过SharedPrefs 保存用户域数据,并使用格式化字符串修改baseUrl。
【问题讨论】:
-
这就是你的单身?你在哪里做你的
retrofit.create()? -
是的,这是负责为我的演示者提供改造的单身人士。我确实有更多单身人士,但他们与问题无关。编辑:我已将我的 create() 单例添加到问题代码中。
-
尝试过类似
baseUrl()和您的请求@POST("{url}"),然后url 等于您的函数的参数,例如@Path("url") String url?只是一个想法。您能说明如何调用您的 API 吗? -
我认为通过 API 接口中的注释插入完整 url 的唯一方法是使用
@URL并且只能在@GET调用中使用。 -
provideRetrofit做得太多了。提供 url、okhttp 客户端,以及 2 个调用适配器和 header 拦截器中的每一个都应该是它自己的方法
标签: android retrofit dagger retrofit2 dagger-2