Android 当密码和确认密码输入错误时,错误响应500未显示
当密码和确认密码输入正确时,我的响应将成功显示…但当它不匹配时,将不会显示到其他部分…不显示任何内容…请指导我…需要帮助…提前感谢 以下是我在邮递员中输入的密码和确认密码错误时的反应:-Android 当密码和确认密码输入错误时,错误响应500未显示,android,validation,kotlin,retrofit,retrofit2,Android,Validation,Kotlin,Retrofit,Retrofit2,当密码和确认密码输入正确时,我的响应将成功显示…但当它不匹配时,将不会显示到其他部分…不显示任何内容…请指导我…需要帮助…提前感谢 以下是我在邮递员中输入的密码和确认密码错误时的反应:- { "status": 500, "message": "Could not reset password.", "error": { "confirm_password": { &quo
{
"status": 500,
"message": "Could not reset password.",
"error": {
"confirm_password": {
"compareWith": "Passwords mismatch."
}
},
"user_msg": "Could not reset password, please try again."
}
这是我的数据类:-
1-->
2-->
3-->
我的回应电话活动:-->
var old_password = findViewById<TextView>(R.id.old_password)
var new_password = findViewById<TextView>(R.id.new_password)
var confirm_password =
findViewById<TextView>(R.id.confirm_new_password)
val resetpwdbutton = findViewById<Button>(R.id.resetpwdbtn)
resetpwdbutton.setOnClickListener {
val old = old_password.text.toString().trim()
val new = new_password.text.toString().trim()
val confirm = confirm_password.text.toString().trim()
val token: String =
SharedPrefManager.getInstance(
applicationContext
).user.access_token.toString()
RetrofitClient.instance.resetpassword(token, old, new, confirm)
.enqueue(object : Callback<Reset_Reponse_Base> {
override fun onFailure(call: Call<Reset_Reponse_Base>, t: Throwable) {
Log.d("res", "" + t)
}
override fun onResponse(
call: Call<Reset_Reponse_Base>,
response: Response<Reset_Reponse_Base>
) {
var res = response
if (res.body()?.status == 200) {
Log.d("response check ", "" + response.body()?.status.toString())
if (res.body()?.status == 200) {
Toast.makeText(
applicationContext,
res.body()?.user_msg,
Toast.LENGTH_LONG
).show()
Log.d("kjsfgxhufb", response.body()?.user_msg.toString())
} else if (res.body()?.status == 500){
val ret: Reset_Response_error = res.body()!!.error
val ret2: Reset_Response_Confirm_password = ret.confirm_password
//confused over here-->
//toast is not getting diaplayed when password and confirm password doesnt match
try {
val jObjError =
JSONObject(response.errorBody()!!.string())
Toast.makeText(
applicationContext,
jObjError.getString("message")+jObjError.getString("user_msg"),
Toast.LENGTH_LONG
).show()
} catch (e: Exception) {
Toast.makeText(applicationContext, e.message, Toast.LENGTH_LONG).show()
Log.e("errorrr",e.message)
}
}
}
}
})
}
var old_password=findviewbyd(R.id.old_password)
var new_password=findviewbyd(R.id.new_password)
确认密码=
findViewById(R.id.确认新密码)
val resetpwdbutton=findviewbyd(R.id.resetpwdbtn)
resetpwdbutton.setOnClickListener{
val old=old_password.text.toString().trim()
val new=new_password.text.toString().trim()
val confirm=confirm_password.text.toString().trim()
val标记:字符串=
SharedPrefManager.getInstance(
应用程序上下文
).user.access_token.toString()
更新client.instance.resetpassword(令牌、旧的、新的、确认的)
.enqueue(对象:回调{
覆盖失效时的乐趣(调用:调用,t:可丢弃){
Log.d(“res”和“+t”)
}
覆盖响应(
呼叫:呼叫,,
答复:答复
) {
var res=响应
if(res.body()?.status==200){
Log.d(“响应检查”,“”+response.body()?.status.toString())
if(res.body()?.status==200){
Toast.makeText(
应用上下文,
res.body()?.user\u msg,
吐司,长度
).show()
Log.d(“kjsfgxhufb”,response.body()?.user_msg.toString())
}否则如果(res.body()?.status==500){
val ret:Reset_Response_error=res.body()!!.错误
val ret2:Reset_Response_Confirm_password=ret.Confirm_password
//困惑在这里-->
//当密码和确认密码不匹配时,toast未显示
试一试{
瓦尔·乔布杰罗=
JSONObject(response.errorBody()!!.string())
Toast.makeText(
应用上下文,
jObjError.getString(“消息”)+jObjError.getString(“用户消息”),
吐司,长度
).show()
}捕获(e:例外){
Toast.makeText(applicationContext,e.message,Toast.LENGTH\u LONG.show())
Log.e(“errorr”,e.message)
}
}
}
}
})
}
在调试器中将此else if(res.body()?.status==500)替换为else if(!res.issusccessful
=>false)后
但是如果我这样做-->else if(res.errorBody()?.equals(500)!!)
我得到这个-->
这很好,但我如何才能访问此[size=176 text={“status”:500,“message”:“无法重置密码”,“error”:{“co…”]
我在内容下的error下有错误消息
我想检索==>消息“:“无法重置密码。”错误“{”co…好的,所以您需要阅读错误响应库
val errorBodyBuffer = Buffer()
res.errorBody()?.writeTo(errorBodyBuffer)
val errorBodyString = errorBodyBuffer.clone().readUtf8()
现在,您可以使用Gson或JsonObject解析errorBodyString
不检查正文响应错误代码检查
if(response.code() == 500){
val errorBody = response.errorBody()
val json = JSONObject(errorBody)
//show toast
}
您必须分析错误正文。以下代码将帮助您分析错误
您可以创建自定义错误类,以便为特定错误类型执行操作。两个异常类可以如下所示:
open class APIError: Exception() {
private val statusCode = 0
fun status(): Int {
return statusCode
}
fun message(): String? {
return message
}
}
class UnknownError : APIError() {}
错误解析器类可以如下所示。我在这里使用了Koling扩展函数来方便地使用它
fun Response<*>.parseError(): Throwable {
val converter: Converter<ResponseBody, APIError?> = RetrofitClient.instance
.responseBodyConverter(APIError::class.java, arrayOfNulls<Annotation>(0))
val error: APIError?
error = try {
if(errorBody() != null) {
converter.convert(errorBody())
} else {
return UnknownError("Something wrong")
}
} catch (e: IOException) {
return APIError()
}
return Throwable(error)
}
您是否检查了响应。isSuccessful
是否为真?@shafayathossain当pwd和confirm pwd键入错误时,我没有获得成功,那么您无法以这种方式获得错误响应。您必须解析错误正文。示例可在此处找到:@shafayathossain只需查看编辑的question@Wini这就是为什么你必须解析错误体,我在我之前的评论中给出了一个链接。它将帮助你分析错误正文。没有仍然不起作用。.我在正文中得到null=>使用调试器…异常消息是什么?我从shafayat那里得到了答案,共享了上面的链接。.感谢你的快速响应:)我一点也没有得到吐司…在调试过程中,我得到的是我上面显示的第二个图像………我的响应在errorbody的内容下,如果你看到了……我怎么能检索到它???它在errorbody()内部,如果你调用response.errorbody(),你应该得到它,只要检查代码我只使用了-->l response.errorbody()…情况仍然是一样的,您可以在您的if Condition中将此行(res.body()?.status==500)更改为res.code()==500吗?问题是,body本身为空。如果整个body为空,您如何检查状态代码他们需要帮助-->
if(response.code() == 500){
val errorBody = response.errorBody()
val json = JSONObject(errorBody)
//show toast
}
open class APIError: Exception() {
private val statusCode = 0
fun status(): Int {
return statusCode
}
fun message(): String? {
return message
}
}
class UnknownError : APIError() {}
fun Response<*>.parseError(): Throwable {
val converter: Converter<ResponseBody, APIError?> = RetrofitClient.instance
.responseBodyConverter(APIError::class.java, arrayOfNulls<Annotation>(0))
val error: APIError?
error = try {
if(errorBody() != null) {
converter.convert(errorBody())
} else {
return UnknownError("Something wrong")
}
} catch (e: IOException) {
return APIError()
}
return Throwable(error)
}
RetrofitClient.instance.resetpassword(token, old, new, confirm)
.enqueue(object : Callback<Reset_Reponse_Base> {
override fun onFailure(call: Call<Reset_Reponse_Base>, t: Throwable) {
Log.d("res", "" + t)
}
override fun onResponse(
call: Call<Reset_Reponse_Base>,
response: Response<Reset_Reponse_Base>
) {
var res = response
if(response.isSuccessful) {
if (res.body().status == 200) {
Log.d("response check ", "" + response.body()?.status.toString())
if (res.body()?.status == 200) {
Toast.makeText(
applicationContext,
res.body()?.user_msg,
Toast.LENGTH_LONG
).show()
Log.d("kjsfgxhufb", response.body()?.user_msg.toString())
} else if (res.body()?.status == 500) {
val ret: Reset_Response_error = res.body()!!.error
val ret2: Reset_Response_Confirm_password = ret.confirm_password
//confused over here-->
//toast is not getting diaplayed when password and confirm password doesnt match
try {
val jObjError =
JSONObject(response.errorBody()!!.string())
Toast.makeText(
applicationContext,
jObjError.getString("message") + jObjError.getString("user_msg"),
Toast.LENGTH_LONG
).show()
} catch (e: Exception) {
Toast.makeText(applicationContext, e.message, Toast.LENGTH_LONG).show()
Log.e("errorrr", e.message)
}
}
}
} else {
val error = res.parseError()
// do your stuffs with error
}
}
})