实际有值时响应体return null
Response body return null when there's actually a value
当状态代码不成功时,我希望响应主体为 return 一个值,因为当我在 Postman 上尝试时,它实际上给了我一条消息或 JSON 的属性之一大批。但是,当我尝试将响应主体存储到变量中时,它总是 return 为空。不知道为什么
这是ApiService
@POST("register")
fun registerAkun(
@Body registrasiAkun: RegistrasiBodyRequest
): Call<RegistrasiResponse>
这里是里面的方法RemoteDataSource
override fun registrasiAkun(registrasiAkun: RegistrasiBodyRequest): LiveData<ApiResponse<RegistrasiResponse>> {
val result = MutableLiveData<ApiResponse<RegistrasiResponse>>()
result.postValue(ApiResponse.Loading)
EspressoIdlingResource.increment()
val client = apiService.registerAkun(registrasiAkun)
client.enqueue(object : Callback<RegistrasiResponse> {
override fun onResponse(
call: Call<RegistrasiResponse>,
response: Response<RegistrasiResponse>
) {
val data = response.body()
Log.d("RemoteDataSource0", "$data")
if (response.isSuccessful) {
result.postValue(data?.let {
ApiResponse.Success(data)
})
} else {
data?.let {
result.postValue(ApiResponse.Error(it.message.toString()))
} ?: run {
Log.d("RemoteDataSource", "$data dan $response")
}
}
}
override fun onFailure(call: Call<RegistrasiResponse>, t: Throwable) {
Log.d("RemoteDataSourceFailure", t.message.toString())
result.postValue(ApiResponse.Error(t.message.toString()))
}
})
return result
}
型号:
data class RegistrasiResponse(
@SerializedName("message")
val message: String? = null,
@SerializedName("customer")
val customer: CustomerResponse? = null
)
data class CustomerResponse(
@field:SerializedName("nama_customer")
val namaCustomer: String?,
@field:SerializedName("id_customer")
val idCustomer: Int?,
@field:SerializedName("email_customer")
val emailCustomer: String?
)
这是日志
I/okhttp.OkHttpClient: --> POST MY_URL
I/okhttp.OkHttpClient: Content-Type: application/json; charset=UTF-8
I/okhttp.OkHttpClient: Content-Length: 84
I/okhttp.OkHttpClient: {"email_customer":"tesaje@gmail.com","nama_customer":"tesdlu","password":"12345678"}
I/okhttp.OkHttpClient: --> END POST (84-byte body)
I/okhttp.OkHttpClient: <-- 409 MY_URL (287ms)
I/okhttp.OkHttpClient: x-powered-by: PHP/7.4.25
I/okhttp.OkHttpClient: cache-control: no-cache, private
I/okhttp.OkHttpClient: content-type: application/json
I/okhttp.OkHttpClient: vary: Accept-Encoding
I/okhttp.OkHttpClient: date: Thu, 25 Nov 2021 06:26:48 GMT
I/okhttp.OkHttpClient: server: LiteSpeed
I/okhttp.OkHttpClient: alt-svc: quic=":443"; ma=2592000; v="43,46", h3-Q043=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-25=":443"; ma=2592000, h3-27=":443"; ma=2592000
I/okhttp.OkHttpClient: {"message":"User Registration Failed!"}
I/okhttp.OkHttpClient: <-- END HTTP (39-byte body)
D/RemoteDataSource0: null
D/RemoteDataSource: null dan Response{protocol=h2, code=409, message=, url=MY_URL}
这是什么
I expect or these
每当响应成功时,return就是这个
RegistrasiResponse(message=Registrasi Sukses, customer=CustomerResponse(namaCustomer=aaaaaa, idCustomer=50, emailCustomer=aaaaa@mail.com))
Postman response success
对于案例 !isSuccessful
,您应该从 errorBody()
而不是 body()
获取正文。
编辑:
您可能需要一个对象来保存 message
。例如
data class ErrorResponse(
val message: String? = null
)
里面 onResponse()
看起来像这样
if (response.isSuccessful) {
result.postValue(response.body()?.let {
ApiResponse.Success(it)
})
} else {
response.errorBody()?.string()?.let {
val error = Gson().fromJson(it, ErrorResponse::class.java)
result.postValue(ApiResponse.Error(error.message.orEmpty()))
} ?: run {
Log.d("RemoteDataSource", "${response.errorBody()?.string()} dan $response")
}
}
当状态代码不成功时,我希望响应主体为 return 一个值,因为当我在 Postman 上尝试时,它实际上给了我一条消息或 JSON 的属性之一大批。但是,当我尝试将响应主体存储到变量中时,它总是 return 为空。不知道为什么
这是ApiService
@POST("register")
fun registerAkun(
@Body registrasiAkun: RegistrasiBodyRequest
): Call<RegistrasiResponse>
这里是里面的方法RemoteDataSource
override fun registrasiAkun(registrasiAkun: RegistrasiBodyRequest): LiveData<ApiResponse<RegistrasiResponse>> {
val result = MutableLiveData<ApiResponse<RegistrasiResponse>>()
result.postValue(ApiResponse.Loading)
EspressoIdlingResource.increment()
val client = apiService.registerAkun(registrasiAkun)
client.enqueue(object : Callback<RegistrasiResponse> {
override fun onResponse(
call: Call<RegistrasiResponse>,
response: Response<RegistrasiResponse>
) {
val data = response.body()
Log.d("RemoteDataSource0", "$data")
if (response.isSuccessful) {
result.postValue(data?.let {
ApiResponse.Success(data)
})
} else {
data?.let {
result.postValue(ApiResponse.Error(it.message.toString()))
} ?: run {
Log.d("RemoteDataSource", "$data dan $response")
}
}
}
override fun onFailure(call: Call<RegistrasiResponse>, t: Throwable) {
Log.d("RemoteDataSourceFailure", t.message.toString())
result.postValue(ApiResponse.Error(t.message.toString()))
}
})
return result
}
型号:
data class RegistrasiResponse(
@SerializedName("message")
val message: String? = null,
@SerializedName("customer")
val customer: CustomerResponse? = null
)
data class CustomerResponse(
@field:SerializedName("nama_customer")
val namaCustomer: String?,
@field:SerializedName("id_customer")
val idCustomer: Int?,
@field:SerializedName("email_customer")
val emailCustomer: String?
)
这是日志
I/okhttp.OkHttpClient: --> POST MY_URL
I/okhttp.OkHttpClient: Content-Type: application/json; charset=UTF-8
I/okhttp.OkHttpClient: Content-Length: 84
I/okhttp.OkHttpClient: {"email_customer":"tesaje@gmail.com","nama_customer":"tesdlu","password":"12345678"}
I/okhttp.OkHttpClient: --> END POST (84-byte body)
I/okhttp.OkHttpClient: <-- 409 MY_URL (287ms)
I/okhttp.OkHttpClient: x-powered-by: PHP/7.4.25
I/okhttp.OkHttpClient: cache-control: no-cache, private
I/okhttp.OkHttpClient: content-type: application/json
I/okhttp.OkHttpClient: vary: Accept-Encoding
I/okhttp.OkHttpClient: date: Thu, 25 Nov 2021 06:26:48 GMT
I/okhttp.OkHttpClient: server: LiteSpeed
I/okhttp.OkHttpClient: alt-svc: quic=":443"; ma=2592000; v="43,46", h3-Q043=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-25=":443"; ma=2592000, h3-27=":443"; ma=2592000
I/okhttp.OkHttpClient: {"message":"User Registration Failed!"}
I/okhttp.OkHttpClient: <-- END HTTP (39-byte body)
D/RemoteDataSource0: null
D/RemoteDataSource: null dan Response{protocol=h2, code=409, message=, url=MY_URL}
这是什么 I expect or these
每当响应成功时,return就是这个
RegistrasiResponse(message=Registrasi Sukses, customer=CustomerResponse(namaCustomer=aaaaaa, idCustomer=50, emailCustomer=aaaaa@mail.com))
Postman response success
对于案例 !isSuccessful
,您应该从 errorBody()
而不是 body()
获取正文。
编辑:
您可能需要一个对象来保存 message
。例如
data class ErrorResponse(
val message: String? = null
)
里面 onResponse()
看起来像这样
if (response.isSuccessful) {
result.postValue(response.body()?.let {
ApiResponse.Success(it)
})
} else {
response.errorBody()?.string()?.let {
val error = Gson().fromJson(it, ErrorResponse::class.java)
result.postValue(ApiResponse.Error(error.message.orEmpty()))
} ?: run {
Log.d("RemoteDataSource", "${response.errorBody()?.string()} dan $response")
}
}