Laravel - Gibt json zusammen mit dem http-Statuscode zurück


86

Wenn ich ein Objekt zurückgebe:

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

Der Statuscode lautet 200. Wie kann ich ihn mit einer Nachricht in 201 ändern und mit dem json-Objekt senden?.

Ich weiß nicht, ob es eine Möglichkeit gibt, den Statuscode in Laravel festzulegen.

Antworten:


115

Sie können http_response_code()damit den HTTP-Antwortcode festlegen.

Wenn Sie keine Parameter übergeben, erhält http_response_code den aktuellen Statuscode. Wenn Sie einen Parameter übergeben, wird der Antwortcode festgelegt.

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

Für Laravel (Referenz von: https://stackoverflow.com/a/14717895/2025923 ):

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

3
Beachten Sie, dass Symfony \ Component \ HttpFoundation \ Antwort ihre eigene vordefinierte Konstanten für HTTP - Statuscodes hat, und wenn Sie andere verwenden , als dass es Ihren Status in etwas nah an ihm ändern wird ... das heißt , wenn Sie Status setzen möchten 449 , Sie erhalten immer den Status 500
Mladen Janjetovic

2
@Tushar was ist, wenn ich keine Daten zurücksenden möchte, nur eine 200 Antwort? Ist response()->json([], 200);in dieser Situation zweckmäßig? Oder ist 200 implizit?
Jonathan

+ (201) diese Antwort
schützt

use Illuminate\Http\Response;und return new Response(['message' => 'test'], 422);arbeitete für mich
Derk Jan Speelman

64

So mache ich das in Laravel 5

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

Oder mit einer Hilfsfunktion:

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

1
@timeNomad Was sind die Vor- und Nachteile dieser beiden Methoden - was wird empfohlen?
DJC

2
@DJC Bei der ersten Methode können Sie Response :: mehrmals nur einmal laden. Bei der zweiten Methode rufen Sie diese Klasse jedes Mal auf, wenn Sie response () -> verwenden (kein Problem, wenn Sie nur eine verwenden).
Marcelo Agimóvel

32

Ich denke, es ist besser, Ihre Antwort unter Kontrolle zu halten, und aus diesem Grund habe ich die offiziellste Lösung gefunden.

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

Fügen Sie dies nach der namespaceDeklaration hinzu:

use Illuminate\Http\Response;

Danke, ich habe nach einem Hinweis darauf gesucht. Haben Sie zufällig einen Link zu den anderen verfügbaren Antwortnamen wie 201, 400 usw. und nicht nur zu den 200 (HTTP_OK)? Ich habe versucht, es zu googeln, konnte es aber noch nicht ganz finden!
jjmu15

1
Nevermind ... hat es gefunden. Hier ist eine vollständige Liste für alle anderen, die danach suchen: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798
jjmu15

13

Es gibt mehrere Möglichkeiten

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

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

Dabei ist STATUS_CODE Ihr HTTP-Statuscode, den Sie senden möchten. Beide sind identisch.

Wenn Sie das Eloquent-Modell verwenden, wird die einfache Rückgabe standardmäßig auch automatisch in JSON konvertiert.

return User::all();

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

Hoffe meine Antwort war hilfreich.


0

Ich bevorzuge den Reaktionshelfer selbst:

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

0

Es ist besser, es mit Hilfsfunktionen zu tun, als mit Fassaden . Diese Lösung funktioniert ab Laravel 5.7 gut

//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. * Sie müssen JSON RESPONSE nicht spezifizieren, da es automatisch in JSON konvertiert wird

return response(['Message'=>'Wrong Credintals'], 400);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.