调用OnFailure并抛出IOException但发布了数据

Shr*_*hna 12 java android retrofit

这是我的网络请求示例

networkAPI.postData(myData).enqueue(new Callback<MyResponse>() {
    @Override
    public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
         if (response.code() == 201) {
             // success
         }
    }
    @Override
    public void onFailure(Call<MyResponse> call, Throwable t) {

    }
});
Run Code Online (Sandbox Code Playgroud)

这是我应该只拨打一次的请求,因为我有一次可用的优惠券代码.如果我立即关闭我的网络连接或者在调用此方法后立即断开连接,那么它会移动到onFailure带有IOExceptionthrowable的方法,这通常是指连接错误,但重点是发布到服务器的数据和使用的凭证代码,问题是onFailure方法在这里被称为.

我确信它不是解析失败,因此我也尝试使用它Void.为什么onResponse即使在发布数据后也没有调用.如何克服这种情况?

Sal*_*Sal 5

我不知道你的后端是什么,但是在C#WebApi中,在服务器端,你可以检查客户端是否仍然通过连接,Response.IsClientConnected但是这个标志仅用于优雅的tcp断开连接我相信.如果客户突然关闭他的互联网,它将无法工作.这只是由于http(和底层tcp)的性质

此外,我认为值得一提的是,请求总是有可能到达服务器但响应没有到达客户端.在没有成功响应客户端的情况下,根本无法保证服务器不会处理凭证.客户端可以发送请求,一旦您准备好返回状态代码200,客户端就可以断开连接.在Web服务设计中应始终考虑这一点.

最好的办法是让客户以某种方式查看过去兑现的优惠券.或者在新鲜的页面上,您可以自动检查是否有过去的凭证兑换尝试(通过其他Web服务方法)并适当地显示响应.