Laravel - повернути json разом із кодом стану http


85

Якщо я повертаю об'єкт:

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

код стану буде 200. Як я можу змінити його на 201, із повідомленням і надіслати його з об’єктом json ?.

Я не знаю, чи є спосіб просто встановити код стану в Laravel.

Відповіді:


114

Ви можете використовувати http_response_code()для встановлення коду відповіді HTTP.

Якщо ви не передасте жодних параметрів, тоді http_response_code отримає поточний код стану. Якщо ви передасте параметр, він встановить код відповіді.

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

Для Laravel (Довідка з: https://stackoverflow.com/a/14717895/2025923 ):

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

3
Майте на увазі, що Symfony \ Component \ HttpFoundation \ Response має власні заздалегідь визначені константи для кодів статусу http, і якщо ви використовуєте крім цього, він змінить ваш статус на щось близьке до нього ... тобто, якщо ви хочете встановити статус 449 , ти завжди отримаєш статус 500
Младен Янетович

2
@Tushar що, якщо я не хочу надсилати назад будь-які дані, просто відповідь 200? Чи response()->json([], 200);придатна ціль у цій ситуації? Або 200 неявно?
Джонатан

+ (201) ця відповідь
захищає

use Illuminate\Http\Response;і return new Response(['message' => 'test'], 422);працював у мене
Дерк Ян Шпельман

64

Ось як я це роблю в Laravel 5

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

Або за допомогою допоміжної функції:

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

1
@timeNomad Які плюси і мінуси цих двох методів - що рекомендується?
DJC

2
@DJC на першому методі ви зможете використовувати Response :: кілька разів, завантажуючи лише один раз. При другому методі ви будете викликати цей клас кожного разу, коли ви використовуєте response () -> (немає проблем, якщо ви будете використовувати лише один).
Марсело Агімовель

32

Я думаю, що є кращою практикою тримати вашу відповідь під єдиним контролем, і з цієї причини я знайшов найбільш офіційне рішення.

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

додайте це після namespaceдекларації:

use Illuminate\Http\Response;

Дякую, я шукав посилання на це. У вас трапляється посилання на інші доступні імена відповідей, такі як 201, 400 тощо, а не лише на 200 (HTTP_OK)? Я спробував погуглити, але поки не зміг знайти!
jjmu15

1
Неважливо ... знайшов. Ось повний список для всіх, хто може його шукати: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798
jjmu15

12

Існує кілька способів

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

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

де STATUS_CODE - ваш код стану HTTP, який ви хочете надіслати. Обидва ідентичні.

якщо ви використовуєте модель Eloquent, то просте повернення також буде автоматично перетворено в JSON за замовчуванням, наприклад,

return User::all();


0

Я віддаю перевагу помічнику відповіді сам:

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

0

Краще це робити з допоміжними функціями, а не з фасадами . Це рішення буде добре працювати з Laravel 5.7 і далі

//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. * Вам не потрібно вказувати JSON RESPONSE, оскільки він автоматично перетворює його на JSON

return response(['Message'=>'Wrong Credintals'], 400);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.