Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android将restful api与mvvm模式相连接_Android_Kotlin_Retrofit_Okhttp_Android Mvvm - Fatal编程技术网

android将restful api与mvvm模式相连接

android将restful api与mvvm模式相连接,android,kotlin,retrofit,okhttp,android-mvvm,Android,Kotlin,Retrofit,Okhttp,Android Mvvm,我正在使用我的自定义后端实现用户登录和注册,我在其中注册或登录时获得一个令牌。然后我将该令牌保存在SharedReferences中 所以,当我想调用一个api时,我在存储库中调用它,存储库是一个kotlin对象,这样它就变成了单例。 在这个应用程序中,当我调用api时,我应该添加一个授权头,从SharedReferences获取令牌并分配给这个头 object MainRepository { private var sharedPreferencesRepository: Share

我正在使用我的自定义后端实现用户登录和注册,我在其中注册或登录时获得一个令牌。然后我将该令牌保存在
SharedReferences

所以,当我想调用一个api时,我在存储库中调用它,存储库是一个kotlin对象,这样它就变成了单例。 在这个应用程序中,当我调用api时,我应该添加一个授权头,从
SharedReferences
获取令牌并分配给这个头

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
类只有在应用程序启动后才会初始化,所以它不会从
SharedReferences
获取新的令牌。我的意思是改造实例只构建一次


那么我该如何解决这个问题呢?我应该为每个api调用动态添加头吗?(有如此多的调用需要授权头,这就是为什么我没有在每个请求中添加头,而是添加了
拦截器

您可以添加拦截器并在
OkhttpClient.Builder()中添加授权头

class-privateService{
var token=SharedReferencesHelper().getToken()
伴星{
私有val拦截器:HttpLoggingInterceptor=HttpLoggingInterceptor(ApiLogger())
.setLevel(HttpLoggingInterceptor.Level.BODY)
private val client=OkHttpClient.Builder()
.readTimeout(60,时间单位为秒)
.connectTimeout(60,时间单位为秒)
.writeTimeout(60,时间单位。秒)
.addInterceptor(对象:拦截器{
覆盖有趣的拦截(链:Interceptor.chain):响应{
val request=chain.request().newBuilder()
.addHeader(“授权”、“承载人”+privateService().token)
.build()
返回链。继续(请求)
}
})
.addInterceptor(拦截器)
.build()
private val reformation=reformation.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.客户(客户)
.build()
//函数在此处访问API
}

您可以在
OkhttpClient.Builder()
中添加拦截器和授权头

class-privateService{
var token=SharedReferencesHelper().getToken()
伴星{
私有val拦截器:HttpLoggingInterceptor=HttpLoggingInterceptor(ApiLogger())
.setLevel(HttpLoggingInterceptor.Level.BODY)
private val client=OkHttpClient.Builder()
.readTimeout(60,时间单位为秒)
.connectTimeout(60,时间单位为秒)
.writeTimeout(60,时间单位。秒)
.addInterceptor(对象:拦截器{
覆盖有趣的拦截(链:Interceptor.chain):响应{
val request=chain.request().newBuilder()
.addHeader(“授权”、“承载人”+privateService().token)
.build()
返回链。继续(请求)
}
})
.addInterceptor(拦截器)
.build()
private val reformation=reformation.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.客户(客户)
.build()
//函数在此处访问API
}

但这是同一件事。改装实例只生成一次,所以在我们构建OkHttpClient时会使用令牌,我的意思是以后不会再调用它,是不是我错了?每次调用此改装变量时,它都会使用授权标头调用API。是的,但我也做了同样的事情,区别是什么rence?在您的示例中,令牌在启动时读取一次,而在第二次启动时,每次调用侦听器(每次http调用)时都会调用它。非常感谢:)但这是同一件事。翻新实例只生成一次,所以在我们构建OkHttpClient时会使用令牌,我的意思是以后不会再次调用它,是吗错误?每次调用此改型变量时,它都会使用授权标头调用API。是的,但我也做了同样的事情,区别是什么?在您的示例中,令牌在启动时读取一次,而在第二次启动时,每次调用侦听器(每次http调用)时都会调用它。非常感谢:)