如何创建 OkHttp 所需的虚拟 ResponseBody 对象?

发布于 2025-01-12 13:31:46 字数 670 浏览 4 评论 0原文

我现在正在传递 null,这会导致崩溃!

请参阅:val 响应:Response= 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

< a href="https://i.sstatic.net/rzc2O.png" rel="nofollow noreferrer">输入图像描述这里

I am passing null right now, which causes a crash!

See: val response: Response<ReviewResponse> = Response.error(-1, null)

Code:

suspend fun getReviewData() = getResult {
        try {
            apiService.getReviewData(getCustomerId())
        } catch (e: Exception) {
            val response: Response<ReviewResponse> = Response.error(-1, null)
            response
        }
    }

   

As you can see null is not accepting internally, and I must need pass this: ResponseBody body

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

人疚 2025-01-19 13:31:46

这个怎么样:

Response.error(404, ResponseBody.create(null, "Not found response body"))

What about this:

Response.error(404, ResponseBody.create(null, "Not found response body"))
两仪 2025-01-19 13:31:46

您可以创建一个像这样的结果数据类

 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>>
}

You can create a result data class like this

 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)"
    }
}

and then create your custom base response like this

 data class CommonResponse<T>(
    @SerializedName("error") val error: Boolean,
    @SerializedName("status") val status: Int,
    @SerializedName("message") val message: String?,
    @SerializedName("response") val response: T?
)

and assign them like this in retrofit

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)
        }
    }

and use them like this in call

interface CheckWhereApi {
    //Check Where API
    @GET("url")
    suspend fun checkWhere(): Response<CommonResponse<MyModel>>
}
表情可笑 2025-01-19 13:31:46

取决于您的要求
addBody() 函数您没有在此处传递任何参数。需要传递参数。

看起来你的代码中缺少 api 构造。
请点击链接了解更多信息-
https://www.chillcoding.com/android-retrofit-send-http/< /a>

++ 更新
取决于您的评论,我认为您没有得到直接答案,我没有给出直接答案,它取决于您遵循的确切架构。
更多信息
java.lang.IllegalArgumentException:代码 < 400:-1
它定义了架构。

 if (code < 400) throw new IllegalArgumentException("code < 400: " + code);

这里我建议您如何返回结果,它非常复杂,您尝试使用一些带有错误句柄和成功句柄的自定义类。

data class ResponseByApi(val success: Any, val code: Int, val 
error : Any)

创建响应模型类并根据网络响应设置值
如成功设置成功主体和代码,否则如果失败设置错误主体和代码 ->根据响应返回。

Depend on your requirement
addBody() function you are not passing any param here. need to pass param.

look like api construction in your code missing .
please follow link to know more-
https://www.chillcoding.com/android-retrofit-send-http/

++ update
depend on your comment i think you not get direct answer , i am not give direct answer, its depend on exact architecture you following.
little bit more info
java.lang.IllegalArgumentException: code < 400: -1
its define architecture.

 if (code < 400) throw new IllegalArgumentException("code < 400: " + code);

here i suggest you how you going to return result its quite complicated , you try with some custom class with error handle and success handle.

data class ResponseByApi(val success: Any, val code: Int, val 
error : Any)

create response model class and set value as per network response
like success set success body and code else if fail set error body and code -> return as per response.

川水往事 2025-01-19 13:31:46

我看到代码看起来:

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 类型。

您可以使用 ResponseEntity 来实现此目的:

新的 ResponseEntity<>(HttpStatus.OK);

它将完全创建 OkHttp 所需的虚拟 ResponseBody 对象。但您需要使用 ResponseEntity 而不是 Response。

或者您可以抛出异常,例如:

throw new ResponseStatusException(
    HttpStatus.NOT_FOUND, "entity not found"
);

来自 org.springframework.web.server.ResponseStatusException

I see that the code looks:

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
}

And you call it:

val response: Response = Response.error(-1, null)

Thus, it will fail by NullPointerException.

Even if you comment on this line, it will fail by IllegalArgumentException because the code is less than 400.

However, you need to return Response<ReviewResponse> type.

You could use ResponseEntity for this:

new ResponseEntity<>(HttpStatus.OK);

It will be exactly creating dummy ResponseBody object which required by OkHttp. But you need to use ResponseEntity instead of Response.

Or you could throw exception, like:

throw new ResponseStatusException(
    HttpStatus.NOT_FOUND, "entity not found"
);

From org.springframework.web.server.ResponseStatusException

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文