Laravel: restituisce json insieme al codice di stato http


86

Se restituisco un oggetto:

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

il codice di stato sarà 200. Come posso cambiarlo in 201, con un messaggio e inviarlo con l'oggetto json ?.

Non so se esiste un modo per impostare semplicemente il codice di stato in Laravel.

Risposte:


117

È possibile utilizzare http_response_code()per impostare il codice di risposta HTTP.

Se non passi alcun parametro, http_response_code otterrà il codice di stato corrente. Se si passa un parametro, verrà impostato il codice di risposta.

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

Per Laravel (riferimento da: https://stackoverflow.com/a/14717895/2025923 ):

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

3
Tieni presente che Symfony \ Component \ HttpFoundation \ Response ha le sue costanti predefinite per i codici di stato http, e se usi un altro da quello cambierà il tuo stato in qualcosa di simile ... cioè se vuoi impostare lo stato 449 , otterrai sempre lo status 500
Mladen Janjetovic

2
@Tushar e se non volessi inviare alcun dato, solo una risposta di 200? È response()->json([], 200);adatto allo scopo in questa situazione? Oppure 200 è implicito?
Jonathan

+ (201) questa risposta mi
salva la

use Illuminate\Http\Response;e ha return new Response(['message' => 'test'], 422);lavorato per me
Derk Jan Speelman

65

Ecco come lo faccio in Laravel 5

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

O utilizzando una funzione di supporto:

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

1
@timeNomad Quali sono i pro e i contro di questi due metodi - quale è consigliato?
DJC

2
@DJC sul primo metodo sarai in grado di utilizzare Response :: più volte caricando solo una volta. Sul secondo metodo chiamerai quella classe ogni volta che usi response () -> (nessun problema se ne usi solo uno).
Marcelo Agimóvel

33

Penso che sia meglio tenere sotto controllo la tua risposta e per questo ho trovato la soluzione più ufficiale.

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

aggiungere questo dopo la namespacedichiarazione:

use Illuminate\Http\Response;

Grazie, stavo cercando un riferimento a questo. Ti capita di avere un collegamento agli altri nomi di risposta disponibili come 201, 400 ecc e non solo il 200 (HTTP_OK)? Ho provato a cercarlo su Google ma non sono ancora riuscito a trovarlo!
jjmu15

1
Non importa ... l'ho trovato. Ecco un elenco completo per chiunque altro possa cercarlo: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798
jjmu15

13

Ci sono molti modi

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

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

dove STATUS_CODE è il codice di stato HTTP che desideri inviare. Entrambi sono identici.

se stai utilizzando il modello eloquente, anche il ritorno semplice verrà convertito automaticamente in JSON per impostazione predefinita come,

return User::all();

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

Spero che la mia risposta sia stata utile.


0

Preferisco personalmente l'helper di risposta:

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

0

È meglio farlo con le funzioni di supporto piuttosto che con le facciate . Questa soluzione funzionerà bene da Laravel 5.7 in poi

//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

0

laravel 7. * Non è necessario specificare JSON RESPONSE perché viene convertito automaticamente in JSON

return response(['Message'=>'Wrong Credintals'], 400);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.