@NikHaker
/

Как правильно возвращать ошибки в своем API, Laravel?

Приветствую. Я возвращаю ошибки в своём API в таком формате:
{
    "error" : {
        "error_code" : 1,
        "error_details" : { ... }
    }
}

Ну и возвращается соответствующий HTTP код ошибки. Содержимое error_details варьируется в зависимости от метода API и ошибки. Например, при ошибке валидации поле error_details будет содержать что-то в этом роде:
{
    "count" => "The count field must be an integer."
}

Это вообще как, нормальный подход?
Главный вопрос в том, как именно и где возвращать ошибки? То есть я, конечно, могу вручную делать return в каждом методе своего API, но это не выглядит правильным, к тому же если структура изменится, мне придется менять весь свой код. Может стоит использовать обработчик исключений? В общем хотелось бы услышать ваши советы и опыт по этой теме.
  • Вопрос задан
  • 4637 просмотров
Решения вопроса 1
могу вручную делать return в каждом методе своего API, но это не выглядит правильным

Почему? Это нормальная практика. Каждый метод - это часть контроллера, а контроллер должен возвращать ответ. Ответ в Laravel должен быть инстансом Response (массив автоматически конвертируется в него).

если структура изменится, мне придется менять весь свой код

Для таких случаев Лара предоставляет возможность создать свой собственный тип ответа, например, ApiResponse. Соответственно, после создания будете вызывать в коде как-то так:
return response()->api($code, $data);
Все форматирование будете делать в классе ApiResponse.

Собственно, чтобы создать, регистрируете в сервис-провайдере новый тип response.
Response::macro('api', function ($code, $data) {
    return new ApiResponse($code, $data);
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Как основной индикатор ошибки API я использую HTTP статусы. Laravel из коробки поддерживает много случаев:
  • Если вы используете встроенную валидацию, то Laravel автоматически возвращает HTTP 422 и json массив с ошибками.
  • Если для получения модели вы используете метод Model::findOrFail(), то Laravel автоматически выбрасывает ModelNotFoundException и автоматически генерирует для него HTTP 404 ответ.
  • Laravel автоматически возвращает корректный HTTP 4xx ответ, если пользователь не авторизован.
  • В остальных случаях можно возвращать ошибки вручную, с использованием хелперов, например: abort(403, 'You don\'t have access to do that');

Таким образом, вручную ошибки возвращать тоже придется, но в большинстве случаев Laravel сделает это за вас.
Ответ написан
Комментировать
Alex_Wells
@Alex_Wells
PHP/Kotlin
Единого формата ответа с ошибками от http api не существует. Есть некие претенденты, но это такое. Возвращать - не надо, надо кидать эксепшены и обрабатывать в хендлере. Лучше - если будет какой-то один базовый class AppException, с помощью которого вы сможете контроллировать соответствие ваших же кастомных ошибок на наличие нужных полей (кода, http кода, сообщения, мета инфа). Как делаю я (пока что прокатывает):
1) с сервера отдаю к каждой уникальной ошибке (например той, что выходит за рамки валидатора) свой код ошибки, как с error_code. У тривиальных ошибок (типа not found или validation) - их нет, так как на нее указывает http код (типа 404 и 422).
2) так же к каждому эксепшену в коде пишу месседж, который так же отдаю в ответе во время разработки. На продакшене вырубаю дебаг и меседж пропадает из ответа от сервера, остается http код и "свой код".

Если говорить только об validation error, то делаю как с error_details, а потом фронтер разбирается с этим так, как оно вписывается в дизайн.
Ответ написан
Комментировать
Nemozar
@Nemozar
Php developer
Я возвращаю всегда через throw exception универсальный механизм и для своих ошибок и вдруг где пропущу исключение, оно будет обработано фронтендом соответственно.
Также для валидации есть свои exception которые будут с вашими ошибками идти в одном формате(два раза не делать обработку) ну и работают колбэки axios и тд, т.к. Http кодом можно в exception управлять
Ответ написан
Комментировать
@motomac
Если используете OAuth 2.0, можно ошибки возвращать в том же формате, дополнив своими кастомными секциями:
{
  "error": "spaceshuttle_crash",
  "error_description": "Houston, we have problems",
  "error_uri": "https://nasa.com/error.html",
  "my_custom_error_code": 42
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы