我现在正在通过
null
,这会导致崩溃!
参见:
val response: Response<ReviewResponse> = Response.error(-1, null)
代码:
suspend fun getReviewData() = getResult {
try {
apiService.getReviewData(getCustomerId())
} catch (e: Exception) {
val response: Response<ReviewResponse> = Response.error(-1, null)
response
}
}
正如你所看到的, null 在内部不接受,我必须通过这个:
ResponseBody body
这个怎么样:
Response.error(404, ResponseBody.create(null, "Not found response body"))
您可以像这样创建结果数据类
data class ApiResult<out T>(
val status: Status,
val data: T?,
val error: Throwable?,
val message: String?
) {
enum class Status {
SUCCESS,
ERROR,
LOADING
}
companion object {
fun <T> success(data: T?): ApiResult<T> {
return ApiResult(Status.SUCCESS, data, null, null)
}
fun <T> error(message: String, error: Throwable?): ApiResult<T> {
return ApiResult(Status.ERROR, null, error, message)
}
fun <T> loading(data: T? = null): ApiResult<T> {
return ApiResult(Status.LOADING, data, null, null)
}
}
override fun toString(): String {
return "Result(status=$status, data=$data, error=$error, message=$message)"
}
}
然后像这样创建自定义基本响应
data class CommonResponse<T>(
@SerializedName("error") val error: Boolean,
@SerializedName("status") val status: Int,
@SerializedName("message") val message: String?,
@SerializedName("response") val response: T?
)
并在改造中像这样分配它们
suspend fun <T> getResponse(
request: suspend () -> Response<T>
): ApiResult<T> {
return try {
val result = request.invoke()
if (result.isSuccessful) {
return ApiResult.success(result.body())
} else {
ApiResult.error("Error", null)
}
} catch (e: Throwable) {
ApiResult.error("Unkown Error", e)
}
}
并在通话中像这样使用它们
interface CheckWhereApi {
//Check Where API
@GET("url")
suspend fun checkWhere(): Response<CommonResponse<MyModel>>
}
取决于您的要求 addBody() 函数您没有在此处传递任何参数。需要传递参数。
看起来您的代码中缺少 api 构造。 请点击链接了解更多信息- https://www.chillcoding.com/android-retrofit-send-http/
++ 更新 取决于您的评论,我认为您没有得到直接答案,我没有给出直接答案,它取决于您遵循的确切架构。 更多信息 java.lang.IllegalArgumentException:代码 < 400: -1 its define architecture.
if (code < 400) throw new IllegalArgumentException("code < 400: " + code);
在这里我建议您如何返回结果,它非常复杂,您尝试使用一些带有错误句柄和成功句柄的自定义类。
data class ResponseByApi(val success: Any, val code: Int, val
error : Any)
创建响应模型类并根据网络响应设置值 就像成功设置成功主体和代码,否则如果失败设置错误主体和代码 -> 根据响应返回。
我看到代码看起来:
public static <T> Response<T> error(int code, ResponseBody body) {
Objects.requireNonNull(body, "body == null");
if (code < 400) throw new IllegalArgumentException("code < 400: " + code);
return ... // build error response
}
你称之为:
val 响应:Response = Response.error(-1, null)
因此,它将因 NullPointerException 而失败。
即使您对此行进行注释,它也会因
IllegalArgumentException
而失败,因为代码小于400
。
但是,您需要返回
Response<ReviewResponse>
类型。
您可以使用
ResponseEntity
来实现此目的:
new ResponseEntity<>(HttpStatus.OK);
这将正是创建OkHttp所需的虚拟ResponseBody对象。但您需要使用
ResponseEntity
而不是 Response。
或者你可以抛出异常,例如:
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, "entity not found"
);
来自
org.springframework.web.server.ResponseStatusException