Обработк ошибок на jquery-ajax + JAX-RS

138
20 мая 2019, 02:40

Кто может поделитесь простым примером, как вы отправляете информативное сообщение, в случае обработки запроса ajax, когда нужно вернуть ошибку.

Как это выглядит на стороне сервера и как это выглядит на стороне клиента

вот например, мой пример

/* формирование ajax-запроса, на проверку аутентификации*/
 function isAuthentication(email, password) {
 $.ajax({
    url: 'api/employees/auth/signin/' + email + '/' + password,
    method: 'get',
    //dataType: 'json',
    success: function () {
        successAuth();
     },
    error: function (data) {
        handlingErrStatusQueryAuth(data);
    }
    });
  }

 var notAccess = "Доступ запрещен!";
 var notAccessEn = "Access denied!"
var successAuth = function () {
$(".authentication").html("OK").css("color","red");
  }
 /*обработка запроса на аутентификацию*/
 var handlingErrStatusQueryAuth = function (data) {
    if (data.status === 401) {
    $(".authentication").html("");
   // $(".authentication").css('color', red);
    $(".authentication").html(notAccess).css("color", "red");
     }
   }

а это сторона сервера

  /**
 * Проверка аутентификации пользователя
 * @param email
   * @param password
 */
    @GET
 @Path( "/auth/signin/{email}/{password}" )
  public Response isValidUser(@PathParam( "email" ) String email,
                            @PathParam( "password" ) String password) {
    EmployeeDao dao = new EmployeeDaoImpl();
    Employee employee = dao.loadEmployeeByFieldStr("email", email);
    String passwordTarget = employee.getPassword();
    if (employee != null && password.equals(passwordTarget)) {
        Response.ResponseBuilder status = Response.ok();
        Response response = status.build();
        return response;
    } else {
        Response.ResponseBuilder status = Response.status(401);
        Response response = status.build();
        return response;
    }
    }

Как это можно переделать, в соответствии с моим вопросом?

Чуть ниже указал ссылку на сайт, где показан один из вариантов, использования WebApplicationException

Answer 1

Я использую php так что бэкенд не буду описывать просто покажу как я принимаю и обрабатываю ответы, а о серверной части расскажу абстрактно.

Для фронтэнда использую JS плагин SweetAlert. Благо алерты на нем делаются моментально и очень красиво. Устанавливается быстро, не имеет зависимостей от jquery или bootstrap.

На сервере я генерирую строку в json формате и статус 200 - выполнено, или ошибку 404, 403, 401 и т.д.

JSON

{
    "message": "Данные успешно удалены",
    "action": "redirect|reload|close",
    "uri": "http://mydomain.com"
}

action это действие которое будет после того как пользователь закроет уведомление

redirect + uri - переадресация, reload - перезагрузка страницы, close - закрытие уведомления и больше ничего (только когда статус 200).

А вот собственно и сам код

function errorHandler(response) {
    try {
        var answer = JSON.parse(response.responseText);
        var message = answer.message !== undefined ? answer.message : 'Неизвестная ошибка!';
        swal({
            type: 'error',
            text: message,
            title: 'Ошибка!',
            html: true
        });
    } catch (err) {
        swal({
            type: 'error',
            text: response.responseText,
            title: 'Ошибка',
            html: true
        });
    }
}
function successHandler(response) {
    try {
        var func;
        var answer = JSON.parse(response);
        var message = answer.hasOwnProperty('message') ? answer.message : 'Все гуд!';
        var action = answer.hasOwnProperty('action') ? answer.action : 'reload';
        if (action == 'redirect') {
            func = function () {
                window.location.href = answer.uri;
            }
        } else if (action == 'reload') {
            func = function () {
                location.reload();
            };
        } else if (action == 'close') {
            func = function () {
                swal.close();
            };
        }
        swal({
            type: 'success',
            text: message,
            title: 'Выполнено',
            closeOnConfirm: false
        }, func);
    } catch (err) {
        elog(response);
        swal({
            type: 'error',
            text: response,
            title: 'Ошибка',
            html: true
        });
    }
}
$.ajax({
    type: 'post',
    url: '/',
    data: {},
    success: function (answer) {
        successHandler(answer);
    },
    error: function (answer) {
        errorHandler(answer);
    }
});
Answer 2

Для различных видов ошибокможно использовать разные исключения и механизм их перехватчиков, оборачивающих исключения в ответ сервера с определённым типом ошибок (HTTP статусом). Соответственно, на беке останется просто время от времени выбрасывать исключения с желаемым текстом, дополнительно описывающим ситуацию. Не забываем логирование на уровне ERROR. На фронте можно просто воспользоваться статусной панкелькой для вывода сообщений с разноцветной подсветкой (красный - критические ошибки, жёлтый - предупреждения, зелёный - информационные соообщения) - такие элементы интерфейса доступны в инструментах на подобие Bootstrap.

READ ALSO
Сортировка сообщений в ArrayList

Сортировка сообщений в ArrayList

Есть кастомный адаптер для лист вью в который добавляются сообщенияПоследовательность сообщений идет сверху вниз

176
Java x64 и x86 в чем разница?

Java x64 и x86 в чем разница?

Откомпилировал одно и тоже приложение примерно по 1000 раз на 86 и 64 разрядной windows 7 результат такой:

168
Сортировка массивов int чисел

Сортировка массивов int чисел

Имеется 2 массива с числамиЭлементы в них находятся в некой зависимости, т

132