如何使用协同程序读取存储库模式中的改装响应

smdnsysy  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(313)

我目前正在关注android中的mvvm和存储库体系结构教程,由于我遇到的教程代码中的抽象,有些事情我不理解。
虽然代码运行良好(编译时没有任何问题),但抽象使我很难理解如何处理改装响应。
存储库

suspend fun login(username: String, password: String) { // LiveData<List<AuthModel>> {
    withContext(Dispatchers.IO) {
        val auth = Network.retrofitInstance?.create(AuthService::class.java)
        val i = auth?.doLoginAsync(username, password)?.await()
        if (i != null) {
            database.authDao.updateAuthInfo(*i.asDatabaseModel())
        }
    }
    //return auth
  }
}

接口

interface ServiceSectionDao{
  @POST("login")
  fun doLoginAsync(
    @Query("user_id") userName: String,
    @Query("password") passWord: String
  ): Deferred<NetworkAuthContainer>
}

改造对象

object Network {

 private var retrofit: Retrofit? = null
 private val BASE_URL = "http://10.0.2.2:8081/api/"

 val retrofitInstance: Retrofit?

 get() {
        if (retrofit == null) {
            var client = OkHttpClient.Builder()
                .addInterceptor(RequestInterceptor())
                .build()

            retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .addCallAdapterFactory(CoroutineCallAdapterFactory())
                .build()

        }
        return retrofit
    }

请求拦截器

class RequestInterceptor : Interceptor {
 var token = "FmQ54sSLm0H0P83EFU7fB2k9flgs5fXQNBS7EgtH";

   fun Token(token: String) {
     this.token = token;
   }

 override fun intercept(chain: Interceptor.Chain): Response {
    var request = chain.request()

    if (request.header("No-Authentication") == null) {
        //val token = getTokenFromSharedPreference();
        //or use Token Function
        if (!token.isNullOrEmpty()) {
            val finalToken = "Bearer " + token
            request = request.newBuilder()
                .addHeader("Authorization", finalToken)
                .build()
        }
     }
     return chain.proceed(request)
  }
}

我从上面的val i=auth?.dologinasync(用户名、密码)?.await()已经是networkauthcontainer,我没有机会检查任何http状态代码。
在调试期间,我可以看到改型返回的结果对象,但我无法处理它,因为我不知道应该在代码中的何处读取requestinterceptor或repository(login)上的值,以及如何读取?

khbbv19g

khbbv19g1#

代码的第一个问题是,您使用的是不推荐使用的CoroutineCalAdapterFactory,从2.6版开始,改型现在具有对kotlin挂起函数的本机支持。所以,你应该做的第一件事就是更新你的 Retrofit 依赖于最新版本。
一旦你这样做了,你就可以更新你的 doLoginAsync

@POST("login")
suspend fun doLogin(                    // use of suspend modifier
    @Query("user_id")  userName: String,
    @Query("password") passWord: String): NetworkAuthContainer     // no need to use Deffered

现在开始 HTTP 您可以从响应中更新返回类型的状态代码 doLoginretrofit2.Response<NetworkAuthContainer> 在您的存储库中

val response = auth!!.doLoginAsync(username, password)    // This is HTTP response
 if (response.code() == 200) {
     // To get NetworkAuthContainer call body()
     database.authDao.updateAuthInfo(*response.body().asDatabaseModel())  
 }
 else{
      // Handle different response codes
 }

相关问题