处理成功和失败改造的 2 个不同的错误响应2

handle 2 different error response for success and failer retrofit2

我目前的成功响应是这样的:

{"status":"success","message":"msg here"}

代码 200

我的错误响应是这样的:

{"status":"failure","message":"There was a validation error","errors":{"shippingAddress":{"phoneNumber":"Please enter a valid phone number"}}}

代码 400

我的问题是下面的代码不起作用,因为它总是在 onFailure() 中运行

        if (response.isSuccessful()) {
            // do something

        } else if (response.code() == 400) {
            Gson gson = new Gson();
            ErrorPhone message = null;
            if (response.errorBody() != null) {
                message = gson.fromJson(response.errorBody().charStream(), ErrorPhone.class);
            }
            if (message != null) {
                Toast.makeText(context, message.getErrors().getShippingAddress().getPhoneNumber(), Toast.LENGTH_LONG).show();
            } else {
                String errors = "";
                try {
                    JSONObject jObjError = new JSONObject(response.errorBody().string());
                    errors = jObjError.getJSONObject("errors").getJSONObject("shippingAddress").getString("phoneNumber");
                } catch (JSONException | IOException e) {
                    e.printStackTrace();
                }
                if (!errors.equals("")) {
                    Toast.makeText(context, errors, Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(context, response.message(), Toast.LENGTH_LONG).show();
                }
            }
        }

在 onFailure 内部我不能听 errorBody 来处理响应

使用名为 onResponseRetrofit 接口并将您的 代码 放在那里。由于 Retrofit 使用两种不同的 callback 方法来处理网络请求的两种可能结果:失败成功请求。 Retrofit 会根据结果调用合适的回调方法。如果请求成功,Retrofit也会把服务器的响应传给你。

有关更多信息,请查看此 link:https://square.github.io/retrofit/2.x/retrofit/retrofit2/Callback.html and https://futurestud.io/tutorials/java-basics-for-retrofit-callbacks 这将帮助您更多地了解改装 Call-backs