如何检索 JSON 令牌并登录,我应该使用 SharedPreferences 吗?

How can I retrieve the JSON token and login and should I use SharedPreferences?

我是 android 工作室和整个 API JSON 协议的新手。我正在尝试使登录服务正常工作。它从 BASE_URL 中显示的后端服务器获取成功登录的信息,成功登录 returns 状态和 token.So 我有以下 LoginActivity 代码:

package com.example.mydoctor

import android.accounts.AccountManager
import android.content.Intent
import android.content.Context
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import android.widget.Toast
import com.example.mydoctor.api.ApiInterface
import com.example.mydoctor.models.LoginRequest
import com.example.mydoctor.models.LoginResponse
import kotlinx.android.synthetic.main.activity_login.*
import org.json.JSONObject
import retrofit2.*
import retrofit2.converter.gson.GsonConverterFactory


const val BASE_URL = "https://docappmy.herokuapp.com/mydoctor/user/"

class LoginActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        val clickRegister = findViewById<TextView>(R.id.clickRegister)
        clickRegister.setOnClickListener {
            val intent = Intent(this, RegisterActivity::class.java);
            startActivity(intent)

        }

//        val loginbtm = findViewById<TextView>(R.id.loginbtm)
//        loginbtm.setOnClickListener {
//            val intent = Intent(this, MainActivity::class.java);
//            startActivity(intent)
//
//        }

        val loginbutton = loginbtm
        var amka = ""
        var password = ""

        loginbutton.setOnClickListener {

            amka = amka_edit_text.text.toString().trim()
            password = password_edit_text.text.toString().trim()

            Log.d("values","The AMKA is: $amka, The password is: $password")



        val retrofitBuilder = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(BASE_URL)
            .build()
            .create(ApiInterface::class.java)

        val retrofitData = retrofitBuilder.loginUser(LoginRequest(amka,password))

        retrofitData.enqueue(object:Callback<LoginResponse>{
            override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
                val responseData = response.body()
                Log.d("SuccessLogin","The response is: $responseData")
//                val intent = Intent(this@LoginActivity,MainActivity::class.java)
//                startActivity(intent)


            }

            override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                Toast.makeText(this@LoginActivity,"FailureLogin",Toast.LENGTH_LONG).show()
                Log.d("loginerror","loginerror: ${t.localizedMessage} - ${t.stackTrace} - ${t.message}")
            }

        })


    }

这个登录请求:

package com.example.mydoctor.models

data class LoginRequest(
    val amka: String, val password: String
)

此登录响应:

套餐com.example.mydoctor.models

import com.google.gson.annotations.SerializedName

data class LoginResponse(
    @SerializedName("status")
    val status: String,
    @SerializedName("Token")
    val token: String
)

还有这个 ApiInterface :

package com.example.mydoctor.api

import com.example.mydoctor.models.LoginRequest
import com.example.mydoctor.models.LoginResponse
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.POST

interface ApiInterface {
    @POST("login")
    fun loginUser(
        @Body loginRequest: LoginRequest
    ): Call<LoginResponse>

}

所以我想检索“status”和“token”的值,然后在成功登录后让登录按钮带我到我的主 activity(正确的 AMKA(与健康保险)和密码。我怎样才能找回它们并进行正确的登录?我应该使用 SharedPreferences 吗?如果是的话怎么办?我真的很困惑。感谢任何帮助。

编辑:

我开始添加以下功能,但我需要输入存储令牌的位置,但不知道如何表达:

   private fun saveData() {
        if(amka_edit_text.text.isEmpty()){
            amka_edit_text.error = "Please enter an AMKA"
            return
        }

        if(password_edit_text.text.isEmpty()){
            password_edit_text.error = "Please enter a password"
        }

        val mypref = getSharedPreferences("mypref", MODE_PRIVATE)

        val editor = mypref.edit()

        editor.putString("token",)

您可以使用共享首选项。

1.将数据写入共享首选项

以下代码块将令牌值保存在共享首选项中

将下面的代码放入您的 onResponse 回调中:

val sharedPref = getSharedPreferences(Context.MODE_PRIVATE)
val editor = sharedPref.edit()
editor.putString("TOKEN", responseData.token)
editor.apply()

2。从共享首选项中读取数据

val sharedPref = getSharedPreferences(Context.MODE_PRIVATE)
val token = sharedPref.getString("TOKEN", null)

您可以在需要的地方使用此令牌值。

注意:共享首选项将数据存储在具有键值的 XML 文件中。在上面的示例中,“TOKEN”字符串值成为您的密钥。如果使用此键找不到值,它将 return 为空。这样就可以查看是否有保存的token了。

如果您想了解更多详细信息,可以查看此文档:https://developer.android.com/training/data-storage/shared-preferences

我还建议您查看加密共享首选项,这是一种更安全的存储敏感数据的方法:https://developer.android.com/topic/security/data