如何检索 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
我是 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