Рукоять: предоставьте базовую информацию для дооснащения учетными данными пользователя

#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 .