Laravel - Retorna json junto com o código de status http

86

Se eu retornar um objeto:

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

o código de status será 200. Como posso alterá-lo para 201, com uma mensagem e enviá-la com o objeto json ?.

Não sei se existe uma maneira de apenas definir o código de status no Laravel.

Galivan
fonte

Respostas:

117

Você pode usar http_response_code()para definir o código de resposta HTTP.

Se você não passar nenhum parâmetro, http_response_code obterá o código de status atual. Se você passar um parâmetro, ele definirá o código de resposta.

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

Para Laravel (referência de: https://stackoverflow.com/a/14717895/2025923 ):

return Response::json([
    'hello' => $value
], 201); // Status code here
Tushar
fonte
3
Lembre-se de que Symfony \ Component \ HttpFoundation \ Response tem suas próprias constantes predefinidas para códigos de status http, e se você usar outro que não isso, ele mudará seu status para algo próximo a ele ... ou seja, se você quiser definir o status 449 , você sempre obterá o status 500
Mladen Janjetovic
2
@Tushar e se eu não quiser enviar nenhum dado de volta, apenas uma resposta 200? É response()->json([], 200);adequado para o propósito nesta situação? Ou 200 está implícito?
Jonathan
+ (201) esta resposta
segura
use Illuminate\Http\Response;e return new Response(['message' => 'test'], 422);trabalhou para mim
Derk Jan Speelman
65

É assim que eu faço no Laravel 5

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

Ou usando uma função auxiliar:

return response()->json(['hello' => $value], 201); 
Jeremy C.
fonte
1
@timeNomad Quais são os prós e os contras desses dois métodos - quais são os recomendados?
DJC
2
@DJC no primeiro método você poderá usar o Response :: várias vezes carregando apenas uma vez. No segundo método, você chamará essa classe sempre que usar response () -> (sem problemas se usar apenas um).
Marcelo Agimóvel
33

Eu acho que é uma prática melhor manter sua resposta sob controle único e por isso descobri a solução mais oficial.

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

adicione isto após a namespacedeclaração:

use Illuminate\Http\Response;
TKoutsou
fonte
Obrigado, eu estava procurando uma referência para isso. Você tem um link para os outros nomes de resposta disponíveis, como 201, 400 etc, e não apenas 200 (HTTP_OK)? Tentei pesquisar no Google, mas ainda não consegui encontrar!
jjmu15
1
Esqueça ... encontrei. Aqui está uma lista completa para qualquer pessoa que possa estar procurando por ele: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798
jjmu15
13

Existem várias maneiras

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

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

onde STATUS_CODE é o código de status HTTP que você deseja enviar. Ambos são idênticos.

se você estiver usando o modelo Eloquent, o retorno simples também será convertido automaticamente em JSON por padrão, como

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

Espero que minha resposta tenha sido útil.

Mikayel Margaryan
fonte
0

Eu mesmo prefiro o auxiliar de resposta:

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

É melhor fazer isso com funções auxiliares em vez de Fachadas . Esta solução funcionará bem a partir do 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
Desenvolvedor de software
fonte
0

laravel 7. * Você não precisa especificar JSON RESPONSE porque é convertido automaticamente para JSON

return response(['Message'=>'Wrong Credintals'], 400);
ABO YAZAN
fonte