#android #kotlin #retrofit #dagger-hilt
Вопрос:
Я пытаюсь реорганизовать один из моих самых первых (плохо написанных) проектов с помощью Hilt. К сожалению, из всех учебников, которые я видел, никто не описывает этот довольно простой случай: укажите имя пользователя и пароль для базовой аутентификации.
Я настроил сетевой модуль, но компилятор справедливо жалуется на «невозможность ввести строковые параметры» для функции «provideRetrofitClient». Параметры, которые я хотел бы передать из модели представления
Модель представления:
@HiltViewModel
class AuthenticationViewModel
@Inject
constructor(
private val apiService: ApiService
) : ViewModel() {
performLogin(username:String,password:String){
viewModelScope.launch {
//how can I pass credentials to apiService?
apiService.login()
}
}
Сетевой модуль:
Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Singleton
@Provides
fun provideGsonBuilder(): Gson = GsonBuilder().setLenient().create()
@Singleton
@Provides
fun provideRetrofitClient(username: String, password: String): OkHttpClient {
return OkHttpClient.Builder()
//this intercemptor allowed credentials set up in the original app
//.addInterceptor(BasicAuthInterceptor(username, password))
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build()
}
@Singleton
@Provides
fun provideRetrofitBuilder(gsonBuilder: Gson, client: OkHttpClient): Retrofit.Builder {
return Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gsonBuilder))
.client(client)
}
@Singleton
@Provides
fun provideApiService(retrofitBuilder: Retrofit.Builder): ApiService {
return retrofitBuilder
.build()
.create(ApiService::class.java)
}
Как внедренный клиент модернизации может быть «настроен» с учетными данными во время выполнения?
Ответ №1:
У NetworkModule, скорее всего, не должно быть параметров имени пользователя/пароля для provideRetrofitClient
функции. Эта функция должна просто создать службу и разрешить ее внедрение там, где вам это нужно.
Если ваш API требует имя пользователя и пароль в качестве параметров запроса в запросе, то имя пользователя и пароль должны быть предоставлены с помощью ApiService's
login
функции as login(@Query("username") username: String, @Query("password") password: String)
. Примечание — строковое значение внутри аннотации запроса зависит от того, какие параметры запроса ожидает API.
Если для вашего API требуется имя пользователя и пароль в теле или пути, взгляните на https://square.github.io/retrofit/ для примеров того, какой login
должна быть ваша функция.
Затем вы можете передать имя пользователя и пароль из своей функции ViewModel performLogin
.