Saltar al contenido

¿Cómo puedo hacer que Laravel devuelva un error personalizado para una API REST JSON?

Solución:

ir a tu app/start/global.php.

Esto convertirá todos los errores de 401 y 404 a un error json personalizado en lugar del stacktrace de Whoops. Agrega esto:

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);        
    }

});

Esta es una de las muchas opciones para manejar estos errores.


Al hacer una API, es mejor crear su propio ayudante como Responser::error(400, 'damn') que extiende el Response clase.

Algo parecido a:

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);
}

Puede pasar una matriz a la respuesta JSON devuelta:

$returnData = array(
    'status' => 'error',
    'message' => 'An error occurred!'
);
return Response::json($returnData, 500);

Esto es lo que uso (Laravel 5.2):

De acuerdo con: https://laravel.com/docs/5.2/errors, podemos especificar una función de render personalizada para errores en appExceptionsHandler.php. Todo lo que hice fue cambiar mi función de renderizado a esto:

    /**
     * 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  IlluminateHttpRequest  $request
     * @param  Exception  $e
     * @return IlluminateHttpResponse
     */
    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's 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;
    }

Después de esto, todo lo que necesita hacer es asegurarse de que todas sus solicitudes de API especifiquen el Accept: application/json encabezamiento. Espero que esto ayude 🙂

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *