Laravel - возвращает json вместе с кодом статуса http

86

Если я верну объект:

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

код состояния будет 200. Как я могу изменить его на 201 с сообщением и отправить его с объектом json ?.

Я не знаю, есть ли способ просто установить код состояния в Laravel.

Галиван
источник

Ответы:

117

Вы можете использовать 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);работал на меня
Дерк Ян Спилман
65

Вот как я это делаю в Laravel 5

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

Или используя вспомогательную функцию:

return response()->json(['hello' => $value], 201); 
Джереми С.
источник
1
@timeNomad Каковы плюсы и минусы этих двух методов - какой из них рекомендуется?
DJC
2
@DJC в первом методе вы сможете использовать Response :: несколько раз, загружая только один раз. Во втором методе вы будете вызывать этот класс каждый раз, когда используете response () -> (нет проблем, если вы будете использовать только один).
Марсело Агимовель
33

Я думаю, что лучше держать свой ответ под единым контролем, и по этой причине я нашел наиболее официальное решение.

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
13

Есть несколько способов

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

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

где STATUS_CODE - ваш код статуса HTTP, который вы хотите отправить. Оба идентичны.

если вы используете модель Eloquent, то простой возврат также будет автоматически преобразован в JSON по умолчанию, например,

return User::all();
iSensical
источник
2
return response(['title' => trans('web.errors.duplicate_title')], 422); //Unprocessable Entity

Надеюсь, мой ответ был полезен.

Микаел Маргарян
источник
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);
ABO YAZAN
источник