Подтвердить что ты не робот

Как я могу заставить Laravel вернуть пользовательскую ошибку для API JSON REST

Я разрабатываю какой-то RESTful API. Когда возникает некоторая ошибка, я бросаю ошибку App::abort($code, $message).

Проблема заключается в следующем: я хочу, чтобы он выбрал json-сформированный массив с ключами "code" и "message", каждый из которых содержит вышеупомянутые данные.

Array
(
    [code] => 401
    [message] => "Invalid User"
)

Кто-нибудь знает, если это возможно, и если да, то как я это делаю?

4b9b3361

Ответ 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);
}