Gson Retrofit Json API возвращает веб-страницу при ошибке - PullRequest
0 голосов
/ 06 ноября 2018

Я использую API, который возвращает объект Json { "results": 1, "data": [...]} при успехе и веб-страницу "<DOCTYPE HTML> <HTML>.... </HTML>" при ошибке. Как я могу справиться с этим? Я использую Retrofit 2 и Gson на Android в Java. Я также использую два пользовательских десериализатора для обработки строки, возвращаемой вместо объекта при ошибке элемента данных.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

в случае, если API возвращает что-то, отличное от HTTP 200 OK, в случае ошибки, может отличаться:

@Override
public void onResponse(@NonNull Call<SomeModel> call, @NonNull Response<SomeModel> response) {
    switch(response.code()) {

        case 200: {
            if (response.body() != null) {
                ...
            }
            break;
        }

        default: {
            if (response.errorBody() != null) {
                String content = response.errorBody().string();
                ...
            }
            break;
        }
    }
}
0 голосов
/ 07 ноября 2018

Пытались ли вы использовать OkHttp3 ResponseBody для вашего звонка, и в зависимости от типа ответа либо анализируйте Json с Gson, либо выводите сообщение об ошибке?

Например, вы можете создать функцию, которая определяет, является ли строка 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 и напрямую отображать html-ответ в нем, используя webView.loadData(resString, "text/html", "UTF-8");

0 голосов
/ 06 ноября 2018

Согласно коду ответа, вы можете справиться с этим, но об этом должен позаботиться ваш бэкэнд. Бэкэнд-разработчик должен дать правильное сообщение об ошибке вместе с кодом ответа.

...