如何解决android使用mvvm模式连接restful api
我正在使用我的自定义后端实现用户登录和注册,我在注册或登录时在其中获得一个令牌。然后我将该令牌保存在 SharedPreferences
中。
所以当我想调用一个 api 时,我在 Repository 中调用它,它是一个 kotlin 对象,这样它就变成了单例。
在这个应用程序中,当我调用 api 时,我应该添加一个授权标头,从 SharedPreferences
获取令牌并分配给这个标头。
object MainRepository {
private var sharedPreferencesRepository: SharedPreferencesRepository
private var retrofit: Retrofit
private lateinit var mainApi:MainApi
init {
sharedPreferencesRepository = SharedPreferencesRepository(MyApplication.context)
val user = sharedPreferencesRepository.getUser()
val httpClient = OkHttpClient.Builder()
.addInterceptor(MyOkHttpClientInterceptor(user.token))
.build()
retrofit =
Retrofit.Builder().baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build()
mainApi = retrofit.create(MainApi::class.java)
}
fun getSomethingFromApi() = myApi.getSomething()
}
问题是,当我启动应用程序并登录时,它工作得很好。但是当我注销并再次登录时,因为 MainRepository
类仅在应用程序启动后初始化,所以它不会从 SharedPreferences
获取新令牌。我的意思是改造实例只构建一次。
那么我该如何解决这个问题呢?我应该为每个 api 调用动态添加标头吗? (有很多调用需要授权标头,这就是为什么我没有在每个请求中添加标头,而是添加了 interceptor
)
解决方法
您可以添加拦截器并在 OkhttpClient.Builder()
中添加您的授权标头。
class RetrofitPrivateService {
var token = SharedPreferencesHelper().getToken()
companion object {
private val interceptor: HttpLoggingInterceptor = HttpLoggingInterceptor(ApiLogger())
.setLevel(HttpLoggingInterceptor.Level.BODY)
private val client = OkHttpClient.Builder()
.readTimeout(60,TimeUnit.SECONDS)
.connectTimeout(60,TimeUnit.SECONDS)
.writeTimeout(60,TimeUnit.SECONDS)
.addInterceptor(object : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request().newBuilder()
.addHeader("Authorization","Bearer " + RetrofitPrivateService().token)
.build()
return chain.proceed(request)
}
})
.addInterceptor(interceptor)
.build()
private val retrofit = Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
// function to access your API here
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。