Gson Retrofit Json API返回错误页面

时间:2018-11-06 09:02:13

标签: android gson retrofit2

我使用的API成功返回Json对象{ "results": 1, "data": [...]},错误返回网页“ <DOCTYPE HTML> <HTML>.... </HTML>”。我该如何处理?我在Java中的Android上使用Retrofit 2和Gson。当数据项出现错误时,我还使用两个自定义反序列化器来处理返回的字符串而不是对象。

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用OkHttp3 ResponseBody进行呼叫,并且根据响应的类型或者用Gson解析Json还是显示错误?

例如,您可以创建一个确定字符串是否为gson的函数,如下所示:

public static boolean isJson(String Json) {
    Gson gson = new Gson();
    try {
        gson.fromJson(Json, Object.class);
        return true;
    } catch (com.google.gson.JsonSyntaxException ex) {
        return false;
    }
}

然后像这样进行改造:

Call<ResponseBody> res = yourService.yourmethod();
res.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        if (response.isSuccessful()) {
            try {
                String resString = response.body().string(); 
                if (isJson(resString)) {
                    Gson gson = new Gson();
                    YourModel responseObject = gson.fromJson(resString, YourModel.class);
                    // do something with the object

                } else { // this is not a Json so most likely your html response

                    // Do something else, like display an error
                }


            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        t.printStackTrace();
    }
});

如果您需要解析html以显示返回的内容,则也可以使用Jsoup,这类似于Document document = Jsoup.parse(resString);,然后对结果进行所需的操作。

您还可以选择使用WebView,并使用webView.loadData(resString, "text/html", "UTF-8");

直接在其中显示html响应。

答案 1 :(得分:0)

根据响应代码,您可以处理它,但后端应多加注意。后端开发人员应提供正确的错误消息以及响应代码。

答案 2 :(得分:0)

如果API错误返回SeqUtils.sneakyThrow以外的内容,则可以有所不同:

HTTP 200 OK