Saltar al contenido

¿Cómo fuerza una respuesta JSON en cada respuesta en Laravel?

Solución:

Cree un middleware como sugirió Alexander Lichter que establezca el Accept encabezado en cada solicitud:

<?php

namespace AppHttpMiddleware;

use Closure;
use IlluminateHttpRequest;

class ForceJsonResponse
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');

        return $next($request);
    }
}

Añádelo a $routeMiddleware en el app/Http/Kernel.php expediente:

protected $routeMiddleware = [
    (...)
    'json.response' => AppHttpMiddlewareForceJsonResponse::class,
];

Ahora puede envolver todas las rutas que deberían devolver JSON:

Route::group(['middleware' => ['json.response']], function () { ... });

Editar: para Laravel 6.9+

Dar el json.response Prioridad de middleware sobre otros middlewares: para manejar casos en los que la solicitud es terminada por otros middlewares (como el Authorize middleware) antes de configurar el Accept encabezamiento.

Para hacer esto, anule el constructor de usted AppHttpKernel clase (app/Http/Kernel.php) con:

    public function __construct( Application $app, Router $router ) {
        parent::__construct( $app, $router );
        $this->prependToMiddlewarePriority(AppHttpMiddlewareForceJsonResponse::class);
    }

Regresar JSON en el controlador solo return $data;

Para JSON respuesta sobre errores, vaya a appExceptionsHandler.php archivo y mire el render método.

Debería poder volver a escribirlo para que se parezca a esto:

public function render($request, Exception $e)
{
    // turn $e into an array.
    // this is sending status code of 500
    // get headers from $request.
    return response()->json($e, 500);
}

Sin embargo, tendrá que decidir qué hacer con $e, porque necesita ser un array. También puede configurar el código de estado y la matriz de encabezado.

Pero luego, ante cualquier error, devolverá un JSON respuesta.

Editar: También es bueno tener en cuenta que puede cambiar el report método para manejar cómo laravel registra el error también. Más info aquí.

Sé que esto ha sido respondido, pero estas no son buenas soluciones porque cambian el código de estado de manera impredecible. la mejor solución es agregar los encabezados apropiados para que Laravel devuelva JSON (creo que es Accept: application/json), o siga este gran tutorial para decirle siempre a Laravel que devuelva JSON: https://hackernoon.com/always-return-json-with-laravel-api-870c46c5efb2

Probablemente también podría hacer esto a través de middleware si quisiera ser más selectivo o adaptarse a una solución más compleja.

¡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 *