У меня две проблемы:
(1.) Я хочу знать, что это лучший способ показать сообщения об ошибках в REST API.
Нужно ли мне бросить исключения или же
я должен использовать ПОСМОТРЕТЬ показать сообщения об ошибках с кодом состояния и т. д. детали.
Я использую FOSRestBundle для обработки задач, связанных с отдыхом.
Я отправляю данные об использовании API в каждом ответе (без запроса потребителя API).
(2.) Если я использую исключение, как добавить свои пользовательские данные в заголовки с сообщением об ошибке.
С RESTful API, вы всегда используйте HTTP-коды для предоставления значимых сообщений клиенту.
Для этого вы используете Response
Объект для отправки различных кодов HTTP. Symfony предоставляет несколько сценариев обработки исключений, которые приведут к 403
, 404
, или же 500
ошибки, но не так много, как этот список. Все исключения, которые будут делать — это генерировать те же HTTP-коды, которые вы могли бы получить вручную, хотя и с более значительными внутренними ошибками отладки в среде разработки, но с меньшим контролем.
к отправить значимый код ошибки HTTP (например, успешно создаваемый объект):
use Symfony\Component\HttpFoundation\Response;
$response = new Response(
'A custom message or an XML/JSON/anything object',
Response::HTTP_CREATED,
array('content-type' => 'text/html')
// Can also be application/json or application/xml .. list goes on
);
но так как вы уже используете FOSRestBundle, вы должны быть чтение документации о слое представления и о том, как его использовать вместо. Слой представления уже обработает эти HTTP-коды для вас и предоставит ответы в нескольких форматах, как и интерфейс RESTful.
Как вы видете Вот Вы можете добавить слушатель для исключений ядра.
Внутри этого слушателя вы можете определить заголовки и код состояния ответа, например:
$response = new Response();
$response->setContent($message);
$response->setStatusCode("YOUR_STATUS_CODE");
$response->headers->replace("YOUR_CUSTOM_HEADERS");
// Send the modified response object to the event
$event->setResponse($response);
Лично я предпочитаю бросать исключения, но стараюсь делать их как можно более конкретными. Таким образом, потребитель API может обрабатывать различные типы исключений.
Тем не менее, если генерируется общее исключение (означает, что что-то пошло не так, как надо), вы все равно можете вернуть правильно отформатированный ответ, и потребитель сможет также обработать ошибку
У меня был тот же вопрос и проблема. Поиск ответа привел меня к этому вопросу. В конце концов мне удалось заставить его работать, и я разместил ответ на аналогичный вопрос (код в вопросе тоже очень полезен) здесь:
FOSRestBundle конфигурация сообщений об исключениях в среде prod
Эта документация также была полезной, хотя я не очень ясно подумал: https://symfony.com/doc/current/bundles/FOSRestBundle/4-exception-controller-support.html