因此,我创建了一个登录名,它将使用来自用户的用户名和密码输入,并用Base64
进行编码,以创建格式为{{1}的令牌 },其中("Authorization", AUTH)
的用户名和密码。这是通过AUTH = "Basic " + Base64 encoding
发送的。
最后,它看起来像这样:Headers
,其中Authorization: Basic XXXXXX
是用户令牌。
然后它将通过API请求检查该用户是否存在于数据库中。
我在与XXXXXX
相同的类中使用Retrofit
和OkHttp3
,该类负责使用API并添加这些RetrofitClient
。
稍后,我在登录活动中使用Headers
类。
我现在需要做的是,通过创建一个RetrofitClient
将“ 令牌”用于所有其他活动,之后将存储Singleton
的数据成功登录。但是我不知道该怎么做。
3周前,我开始学习Kotlin和Android。
这是我的代码:
GET_LOGIN.kt
Retrofit
RetrofitClient.kt
interface GET_LOGIN {
@GET("login")
fun getAccessToken() : Call<String>
}
LoginActivity.kt
class RetrofitClient {
fun login(username:String, password:String){
val credentials = username + ":" + password
val AUTH = "Basic " + Base64.encodeToString(credentials.toByteArray(Charsets.UTF_8), Base64.DEFAULT).trim()
retrofit = init(AUTH)
}
// Initializing Retrofit
fun init(AUTH: String) : Retrofit{
// Creating the instance of an Interceptor
val logging = HttpLoggingInterceptor()
logging.level = HttpLoggingInterceptor.Level.BODY
// Creating the OkHttp Builder
val client = OkHttpClient().newBuilder()
// Creating the custom Interceptor with Headers
val interceptor = Interceptor { chain ->
val request = chain?.request()?.newBuilder()?.addHeader("Authorization", AUTH)?.build()
chain?.proceed(request)
}
client.addInterceptor(interceptor) // Attaching the Interceptor
//client.addInterceptor(logging) // Attaching the Interceptor
// Creating the instance of a Builder
val retrofit = Retrofit.Builder()
.baseUrl("https://srodki.herokuapp.com/") // The API server
.client(client.build()) // Adding Http Client
.addConverterFactory(GsonConverterFactory.create()) // Object Converter
.build()
return retrofit
}
lateinit var retrofit : Retrofit
fun providesGetLogin(): GET_LOGIN = retrofit.create(GET_LOGIN::class.java)
}
答案 0 :(得分:1)
首先,请在Java和Kotlin上使用驼峰式大小写。我们在Java和kotlin上都有关于编程的标准。而且我可以看到您正在尝试执行DI,但是那不是您在Android中执行的方式。
无论如何,您可以通过以下两种方式执行此操作,甚至不使用单例,而是将其保存在存储中。选项是共享首选项,本地存储和SQLite。但是,如果您坚持使用单例。您可以这样做:
object MySingleton { // This is how you declare singletons in kotlin
lateinit var token: String;
}
因此,从您的评论看来,您似乎需要存储令牌。您可以先使用sharedpreferences(数据库会更好)并将令牌存储在此处。我想你不知道怎么做,这是一个例子:
val sp = SharedPreferences("sp", 0);
sp.edit().putString("token", theTokenVariable); // not sure of this function
sp.edit().apply(); // you could use commit if you dont mind sharedpreferences to lag your screen(if it ever will)
现在您如何从改造中获得代币?我现在可以为您提供帮助的唯一方法是,您可以从改造调用的onResponse收到的响应变量中检索响应主体。从那里开始就是您的问题伴侣。我不知道您的回复格式如何,应如何检索等。 建议将其格式化为JSON。