如何使用 retrofit2 Kotlin 解析响应
How to parse response with retrofit2 Kotlin
我无法解析响应。在 Swift 中,我可以创建一个代码来帮助解析 json 响应。我是 Kotlin 的新手,正在处理其他人的现有项目。我为字符串和布尔值创建了一个数据 class,但我不知道解析它的语法。请帮忙,谢谢。
响应主体json
{
"bearerToken": "########",
"staySignIn": false
}
//Interface
interface PostInterface {
class User(
val email: String,
val password: String
)
@POST("signIn")
fun signIn(@Body user: User): Call<ResponseBody>
//Network handler
fun signIn(email: String, password: String): MutableLiveData<Resource> {
val status: MutableLiveData<Resource> = MutableLiveData()
status.value = Resource.loading(null)
val retrofit = ServiceBuilder.buildService(PostInterface::class.java)
retrofit.signIn(PostInterface.User(email, password)).enqueue(object : Callback<ResponseBody> {
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
errorMessage(status)
}
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.code() == 200) {
try {
status.value = //how to parse using the model??
} catch (ex: Exception) {
parseError(400, response.body().toString(), status)
}
} else {
//do something...
}
}
})
return status
}
//Model
data class SignInModel(
@field:SerializedName("bearerToken")
val bearerToken: String? = null,
@field:SerializedName("staySignIn")
val staySignIn: Boolean? = null
)
//Storing value class
class RrefManager constructor(var applicationContext: Context) {
private fun getSharedPrefEditor(): sharedPrefEditor.Editor {
return applicationContext.getSharedPrefEditor(prefStorageName, Context.MODE_PRIVATE).edit()
}
public fun setBearerToken(token: String) {
getSharedPrefEditor().putString("bearerToken", token).apply()
}
public fun setStaySignIn(enabled: Boolean) {
getSharedPrefEditor().putBoolean("staySignIn", enabled).apply()
}
}
//SignIn Button
viewModel.signIn().observe(viewLifecycleOwner, androidx.lifecycle.Observer { v ->
if (v.status == Resource.Status.SUCCESS) {
val model = v.data as SignInModel
pref.setToken(model.token as String) //storing value
pref.setTwoFactorEnabled(model.twoFactorEnabled as Boolean) //storing value
} else if (v.status == Resource.Status.ERROR) {
//do something...
}
})
我认为实现类似 swift 中的可编码功能的最佳选择是使用 Gson 库来解析 api 响应。
当您创建改造实例时,您将 gson 转换器传递给构建器,例如:
val retrofit = Retrofit.Builder()
.baseUrl(BaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
完成后,您可以将 api return 作为数据 class 的响应,例如:
//Interface
interface PostInterface {
@POST("signIn")
fun signIn(@Body user: User): Call<SignInModel>
}
要从您的 class 上的回调中读取答案,网络调用中的响应已经在回调中解析到您的模型中。所有的改造回调都应该改为接收回调然后你可以直接访问像 status.value = response.body()
有关更多信息,您可以查阅改装库页面,其中提供了有关如何正确使用它的所有详细信息和说明。
我无法解析响应。在 Swift 中,我可以创建一个代码来帮助解析 json 响应。我是 Kotlin 的新手,正在处理其他人的现有项目。我为字符串和布尔值创建了一个数据 class,但我不知道解析它的语法。请帮忙,谢谢。
响应主体json
{
"bearerToken": "########",
"staySignIn": false
}
//Interface
interface PostInterface {
class User(
val email: String,
val password: String
)
@POST("signIn")
fun signIn(@Body user: User): Call<ResponseBody>
//Network handler
fun signIn(email: String, password: String): MutableLiveData<Resource> {
val status: MutableLiveData<Resource> = MutableLiveData()
status.value = Resource.loading(null)
val retrofit = ServiceBuilder.buildService(PostInterface::class.java)
retrofit.signIn(PostInterface.User(email, password)).enqueue(object : Callback<ResponseBody> {
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
errorMessage(status)
}
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.code() == 200) {
try {
status.value = //how to parse using the model??
} catch (ex: Exception) {
parseError(400, response.body().toString(), status)
}
} else {
//do something...
}
}
})
return status
}
//Model
data class SignInModel(
@field:SerializedName("bearerToken")
val bearerToken: String? = null,
@field:SerializedName("staySignIn")
val staySignIn: Boolean? = null
)
//Storing value class
class RrefManager constructor(var applicationContext: Context) {
private fun getSharedPrefEditor(): sharedPrefEditor.Editor {
return applicationContext.getSharedPrefEditor(prefStorageName, Context.MODE_PRIVATE).edit()
}
public fun setBearerToken(token: String) {
getSharedPrefEditor().putString("bearerToken", token).apply()
}
public fun setStaySignIn(enabled: Boolean) {
getSharedPrefEditor().putBoolean("staySignIn", enabled).apply()
}
}
//SignIn Button
viewModel.signIn().observe(viewLifecycleOwner, androidx.lifecycle.Observer { v ->
if (v.status == Resource.Status.SUCCESS) {
val model = v.data as SignInModel
pref.setToken(model.token as String) //storing value
pref.setTwoFactorEnabled(model.twoFactorEnabled as Boolean) //storing value
} else if (v.status == Resource.Status.ERROR) {
//do something...
}
})
我认为实现类似 swift 中的可编码功能的最佳选择是使用 Gson 库来解析 api 响应。
当您创建改造实例时,您将 gson 转换器传递给构建器,例如:
val retrofit = Retrofit.Builder()
.baseUrl(BaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
完成后,您可以将 api return 作为数据 class 的响应,例如:
//Interface
interface PostInterface {
@POST("signIn")
fun signIn(@Body user: User): Call<SignInModel>
}
要从您的 class 上的回调中读取答案,网络调用中的响应已经在回调中解析到您的模型中。所有的改造回调都应该改为接收回调然后你可以直接访问像 status.value = response.body()
有关更多信息,您可以查阅改装库页面,其中提供了有关如何正确使用它的所有详细信息和说明。