改造/OkHttp3 400 错误 Body 空

Retrofit / OkHttp3 400 Error Body Empty

我在 Android 项目中使用 Retrofit 2。当我使用 GET 方法命中 API 端点并且它 returns 400 级错误时,我可以在使用 HttpLoggingInterceptor 时看到错误内容,但是当我到达 Retrofit OnResponse 回调时,错误 body的字符串为空。

我可以看到错误有一个 body,但在 Retrofit 回调的上下文中我似乎无法提取 body。有没有办法确保可以在那里访问 body?

谢谢, 亚当

编辑: 我从服务器看到的响应是: {"error":{"errorMessage":"For input string: \"000001280_713870281\"","httpStatus":400}}

我正在尝试通过以下方式从响应中提取该响应: BaseResponse baseResponse = GsonHelper.getObject(BaseResponse.class, response.errorBody().string()); if (baseResponse != null && !TextUtils.isEmpty(baseResponse.getErrorMessage())) error = baseResponse.getErrorMessage();

(GsonHelper 只是一个助手,它通过 GSON 传递 JSON 字符串以拉取 BaseResponse 类型的 object)

对 response.errorBody().string() 的调用导致 IOException: Content-Length 并且流长度不一致,但我在 Log Cat[=13= 中看到上面 2 行的内容]

如果您得到 400,那么您尝试发送到服务器的请求是错误的。 检查您的获取请求。

我之前遇到过同样的问题,我用代码response.errorBody().string()修复了它 only 一次。如果您多次使用它,您将收到 IOException,因此建议仅将其用作一次性流,就像 ResponseBody 上的文档所说的那样。

我的建议是:立即将 Stringified errorBody() 转换为对象,因为后者是您将在后续操作中使用的对象。

首先创建一个错误 class,如下所示:

public class ApiError {
    @SerializedName("httpStatus")
    private int statusCode;
    @SerializedName("errorMessage")
    private String message;

    public ApiError() {

    }

    public ApiError(String message) {
        this.message = message;
    }

    public ApiError(int statusCode, String message) {
        this.statusCode = statusCode;
        this.message = message;
    }

    public int status() {
        return statusCode;
    }

    public String message() {
        return message;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }
}

其次,您可以创建一个 Utils class 来处理您的错误,如下所示:

public final class ErrorUtils {
    private ErrorUtils() {

    }

    public static ApiError parseApiError(Response<?> response) {
        final Converter<ResponseBody, ApiError> converter =
                YourApiProvider.getInstance().getRetrofit()
                        .responseBodyConverter(ApiError.class, new Annotation[0]);

        ApiError error;
        try {
            error = converter.convert(response.errorBody());
        } catch (IOException e) {
            error = new ApiError(0, "Unknown error"
        }
        return error;
    }

最后像下面这样处理你的错误:

if (response.isSuccessful()) {
   // Your response is successfull
   callback.onSuccess();
   } 
else {
   callback.onFail(ErrorUtils.parseApiError(response));
   }

希望对您有所帮助。祝你好运。