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.