Как я могу заставить Laravel вернуть пользовательскую ошибку для API JSON REST
Я разрабатываю какой-то RESTful API. Когда возникает некоторая ошибка, я бросаю ошибку App::abort($code, $message)
.
Проблема заключается в следующем: я хочу, чтобы он выбрал json-сформированный массив с ключами "code" и "message", каждый из которых содержит вышеупомянутые данные.
Array
(
[code] => 401
[message] => "Invalid User"
)
Кто-нибудь знает, если это возможно, и если да, то как я это делаю?
Ответы
Ответ 1
перейдите к app/start/global.php
.
Это преобразует все ошибки для 401
и 404
в пользовательскую json-ошибку, а не из stackoprace. Добавьте это:
App::error(function(Exception $exception, $code)
{
Log::error($exception);
$message = $exception->getMessage();
// switch statements provided in case you need to add
// additional logic for specific error code.
switch ($code) {
case 401:
return Response::json(array(
'code' => 401,
'message' => $message
), 401);
case 404:
$message = (!$message ? $message = 'the requested resource was not found' : $message);
return Response::json(array(
'code' => 404,
'message' => $message
), 404);
}
});
Это один из многих вариантов обработки этих ошибок.
Создавая API, лучше создать свой собственный помощник, например Responser::error(400, 'damn')
, который расширяет класс Response
.
Скорее всего:
public static function error($code = 400, $message = null)
{
// check if $message is object and transforms it into an array
if (is_object($message)) { $message = $message->toArray(); }
switch ($code) {
default:
$code_message = 'error_occured';
break;
}
$data = array(
'code' => $code,
'message' => $code_message,
'data' => $message
);
// return an error
return Response::json($data, $code);
}
Ответ 2
Вы можете передать массив возвращаемому ответу JSON:
$returnData = array(
'status' => 'error',
'message' => 'An error occurred!'
);
return Response::json($returnData, 500);
Ответ 3
Вот что я использую (Laravel 5.2):
В соответствии с: https://laravel.com/docs/5.2/errors мы можем указать собственную функцию визуализации для ошибок в app\Exceptions\Handler.php
. Все, что я сделал, это изменить мою функцию рендеринга на это:
/**
* Render an exception into an HTTP response.
* Updated to return json for a request that wantsJson
* i.e: specifies
* Accept: application/json
* in its header
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($request->ajax() || $request->wantsJson()) {
return response()->json(
$this->getJsonMessage($e),
$this->getExceptionHTTPStatusCode($e)
);
}
return parent::render($request, $e);
}
protected function getJsonMessage($e){
// You may add in the code, but it duplication
return [
'status' => 'false',
'message' => $e->getMessage()
];
}
protected function getExceptionHTTPStatusCode($e){
// Not all Exceptions have a http status code
// We will give Error 500 if none found
return method_exists($e, 'getStatusCode') ?
$e->getStatusCode() : 500;
}
После этого все, что вам нужно сделать, это убедиться, что все ваши запросы API указывают заголовок Accept: application/json
. Надеюсь, это поможет:)
Ответ 4
В соответствии с ответом Ибрагима, не каждый запрос ajax хочет JSON, ответ "код состояния" и "статус" не нужны, поскольку оба они означают одно и то же. Более того, нет необходимости упоминать в ответе "статус" вообще, поскольку код ответа "говорит", что. Что-то вроде этого должно работать отлично:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($request->wantsJson())
return response()->json(
['message' => $e->getMessage()],
method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500);
return parent::render($request, $e);
}