Laravel - Devuelve json junto con el código de estado http

85

Si devuelvo un objeto:

return Response::json([
    'hello' => $value
]);

el código de estado será 200. ¿Cómo puedo cambiarlo a 201, con un mensaje y enviarlo con el objeto json ?.

No sé si hay una manera de configurar el código de estado en Laravel.

Galivan
fuente

Respuestas:

114

Puede utilizar http_response_code()para configurar el código de respuesta HTTP.

Si no pasa ningún parámetro, http_response_code obtendrá el código de estado actual. Si pasa un parámetro, establecerá el código de respuesta.

http_response_code(201); // Set response status code to 201

Para Laravel (referencia de: https://stackoverflow.com/a/14717895/2025923 ):

return Response::json([
    'hello' => $value
], 201); // Status code here
Tushar
fuente
3
Tenga en cuenta que Symfony \ Component \ HttpFoundation \ Response tiene sus propias constantes predefinidas para los códigos de estado http, y si usa algo diferente, cambiará su estado a algo parecido ... es decir, si desea establecer el estado 449 , siempre obtendrás el estado 500
Mladen Janjetovic
2
@Tushar, ¿qué pasa si no quiero devolver ningún dato, solo una respuesta 200? ¿Es response()->json([], 200);adecuado para su propósito en esta situación? ¿O es 200 implícito?
Jonathan
+ (201) esta respuesta me
protege la
use Illuminate\Http\Response;y return new Response(['message' => 'test'], 422);funcionó para mí
Derk Jan Speelman
64

Así es como lo hago en Laravel 5

return Response::json(['hello' => $value],201);

O usando una función auxiliar:

return response()->json(['hello' => $value], 201); 
Jeremy C.
fuente
1
@timeNomad ¿Cuáles son los pros y los contras de estos dos métodos? ¿Cuál se recomienda?
DJC
2
@DJC en el primer método, podrá usar Response :: varias veces cargando solo una vez. En el segundo método, llamará a esa clase cada vez que use response () -> (no hay problema si usa solo uno).
Marcelo Agimóvel
32

Creo que es una mejor práctica mantener su respuesta bajo control único y por esta razón descubrí la solución más oficial.

response()->json([...])
    ->setStatusCode(Response::HTTP_OK, Response::$statusTexts[Response::HTTP_OK]);

agregue esto después de la namespacedeclaración:

use Illuminate\Http\Response;
TKoutsou
fuente
Gracias, estaba buscando una referencia a esto. ¿Tiene un enlace a los otros nombres de respuesta disponibles, como 201, 400, etc. y no solo a 200 (HTTP_OK)? Intenté buscarlo en Google, ¡pero todavía no he podido encontrarlo!
jjmu15
1
No importa ... lo encontré. Aquí hay una lista completa para cualquier otra persona que pueda estar buscándola: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798
jjmu15
12

Hay varias formas

return \Response::json(['hello' => $value], STATUS_CODE);

return response()->json(['hello' => $value], STATUS_CODE);

donde STATUS_CODE es el código de estado HTTP que desea enviar. Ambos son idénticos.

si está utilizando el modelo Eloquent, entonces el retorno simple también se convertirá automáticamente en JSON de forma predeterminada, como,

return User::all();
iSensical
fuente
2
return response(['title' => trans('web.errors.duplicate_title')], 422); //Unprocessable Entity

Espero que mi respuesta haya sido útil.

Mikayel Margaryan
fuente
0

Yo mismo prefiero el asistente de respuesta:

    return response()->json(['message' => 'Yup. This request succeeded.'], 200);
Dylan Pierce
fuente
0

Es mejor hacerlo con funciones auxiliares en lugar de fachadas . Esta solución funcionará bien desde Laravel 5.7 en adelante

//import dependency
use Illuminate\Http\Response;

//snippet
return \response()->json([
   'status' => '403',//sample entry
   'message' => 'ACCOUNT ACTION HAS BEEN DISABLED',//sample message
], Response::HTTP_FORBIDDEN);//Illuminate\Http\Response sets appropriate headers
Desarrollador de software
fuente
0

laravel 7. * No tienes que especificar JSON RESPONSE porque se convierte automáticamente a JSON

return response(['Message'=>'Wrong Credintals'], 400);
ABO YAZAN
fuente