Laravel - Zwróć plik json wraz z kodem statusu http

85

Jeśli zwrócę przedmiot:

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

kod statusu to 200. Jak mogę zmienić go na 201, z komunikatem i wysłać go z obiektem json ?.

Nie wiem, czy istnieje sposób, aby po prostu ustawić kod statusu w Laravel.

Galivan
źródło

Odpowiedzi:

114

Możesz użyć http_response_code()do ustawienia kodu odpowiedzi HTTP.

Jeśli nie przekażesz żadnych parametrów, kod http_response_code otrzyma aktualny kod stanu. Jeśli przekażesz parametr, ustawi on kod odpowiedzi.

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

Dla Laravel (źródło z: https://stackoverflow.com/a/14717895/2025923 ):

return Response::json([
    'hello' => $value
], 201); // Status code here
Tushar
źródło
3
Pamiętaj, że Symfony \ Component \ HttpFoundation \ Response ma własne predefiniowane stałe dla kodów statusu http, a jeśli użyjesz innego niż ten, zmieni twój status na coś zbliżonego ... tj. Jeśli chcesz ustawić status 449 , zawsze otrzymasz status 500
Mladen Janjetovic
2
@Tushar a co jeśli nie chcę odsyłać żadnych danych, tylko odpowiedź 200? Czy response()->json([], 200);nadaje się do celu w tej sytuacji? Czy może 200 jest ukryta?
Jonathan,
+ (201) ta odpowiedź zabezpiecza mój wieczór :)
maytham-ɯɐɥʇʎɐɯ
use Illuminate\Http\Response;i return new Response(['message' => 'test'], 422);pracował dla mnie
Derk Jan Speelman
64

Tak to robię w Laravel 5

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

Lub używając funkcji pomocniczej:

return response()->json(['hello' => $value], 201); 
Jeremy C.
źródło
1
@timeNomad Jakie są wady i zalety tych dwóch metod - które są zalecane?
DJC
2
@DJC na pierwszej metodzie będziesz mógł użyć Response :: kilka razy ładując tylko raz. W drugiej metodzie będziesz wywoływał tę klasę za każdym razem, gdy użyjesz response () -> (nie ma problemu, jeśli użyjesz tylko jednej).
Marcelo Agimóvel
32

Myślę, że lepszą praktyką jest trzymanie odpowiedzi pod jedną kontrolą iz tego powodu znalazłem najbardziej oficjalne rozwiązanie.

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

dodaj to po namespacedeklaracji:

use Illuminate\Http\Response;
TKoutsou
źródło
Dzięki, szukałem odniesienia do tego. Czy masz link do innych dostępnych nazw odpowiedzi, takich jak 201, 400 itd., A nie tylko 200 (HTTP_OK)? Próbowałem google, ale jeszcze nie udało mi się go znaleźć!
jjmu15
1
Nieważne ... znalazłem to. Oto pełna lista dla każdego, kto może jej szukać: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798
jjmu15
12

Jest wiele sposobów

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

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

gdzie STATUS_CODE to kod statusu HTTP, który chcesz wysłać. Obie są identyczne.

jeśli używasz modelu Eloquent, prosty zwrot również zostanie domyślnie automatycznie przekonwertowany na JSON , np.

return User::all();
iSensical
źródło
2
return response(['title' => trans('web.errors.duplicate_title')], 422); //Unprocessable Entity

Mam nadzieję, że moja odpowiedź była pomocna.

Mikayel Margaryan
źródło
0

Sam wolę pomocnika odpowiedzi:

    return response()->json(['message' => 'Yup. This request succeeded.'], 200);
Dylan Pierce
źródło
0

Lepiej jest to zrobić za pomocą funkcji pomocniczych niż Fasady . To rozwiązanie będzie działać dobrze od Laravel 5.7 i nowszych

//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
Programista
źródło
0

laravel 7. * Nie musisz specyfikować JSON RESPONSE, ponieważ jest on automatycznie konwertowany na JSON

return response(['Message'=>'Wrong Credintals'], 400);
ABO YAZAN
źródło