Laravel - Return json along with http status code
Asked Answered
H

10

123

If I return an object:

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

the status code will be 200. How can I change it to 201, with a message and send it with the json object?.

I don't know if there is a way to just set the status code in Laravel.

Hygrostat answered 30/6, 2015 at 6:30 Comment(0)
S
152

You can use http_response_code() to set HTTP response code.

If you pass no parameters then http_response_code will get the current status code. If you pass a parameter it will set the response code.

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

For Laravel(Reference from: https://mcmap.net/q/182312/-laravel-won-39-t-obey-status-code):

return Response::json([
    'hello' => $value
], 201); // Status code here
Sled answered 30/6, 2015 at 6:34 Comment(4)
Keep in mind that Symfony\Component\HttpFoundation\Response has its own predefined constants for http status codes, and if you use other than that it will change your status into something close to it... i.e. if you want to set status 449, you will always get status 500Electrotype
@Sled what if I don't want to send any data back, just a 200 response? Is response()->json([], 200); fit for purpose in this situation? Or is 200 implicit?Voiceful
+ (201) this answer safes my evening :)Undamped
use Illuminate\Http\Response; and return new Response(['message' => 'test'], 422); worked for meGismo
Z
93

This is how I do it in Laravel 5

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

Or using a helper function:

return response()->json(['hello' => $value], 201); 
Zildjian answered 30/6, 2015 at 6:38 Comment(2)
@timeNomad What are the pros and cons of these two methods - which is recommended?Trotter
@Trotter on first method you will be able to use Response:: several times loading only once. On second method you will call that class to each time you use response()-> (no problem if you'll use only one).Caiman
R
48

I think it is better practice to keep your response under single control and for this reason I found out the most official solution.

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

add this after namespace declaration:

use Illuminate\Http\Response;
Rancid answered 31/10, 2016 at 13:42 Comment(2)
Thanks, I was looking for a reference to this. Do you happen to have a link to the other available response names such as 201, 400 etc and not just the 200 (HTTP_OK)? I've tried googling it but haven't been able to find it quite yet!Scorpaenid
Nevermind... found it. Here is a complete list for anyone else who may be looking for it: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798Scorpaenid
D
16

There are multiple ways

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

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

where STATUS_CODE is your HTTP status code you want to send. Both are identical.

if you are using Eloquent model, then simple return will also be auto converted in JSON by default like,

return User::all();
Dominicadominical answered 20/9, 2016 at 11:0 Comment(1)
And how to set the Status Code if returning Eloquent Models or Resources?Agranulocytosis
L
6

laravel 7.* You don't have to speicify JSON RESPONSE cause it's automatically converted it to JSON

return response(['Message'=>'Wrong Credintals'], 400);
Lynnettelynnworth answered 15/9, 2020 at 19:12 Comment(0)
G
3
return response(['title' => trans('web.errors.duplicate_title')], 422); //Unprocessable Entity

Hope my answer was helpful.

Geelong answered 8/5, 2018 at 15:8 Comment(1)
this one is helpful ! Thanks :)Triglyceride
S
3

I always use this type of json response format, this will help you...

return response()->json(['success'=>'true','message' => 'Successfully Done.'], 200);
Sizzler answered 27/10, 2022 at 4:50 Comment(0)
J
1

It's better to do it with helper functions rather than Facades. This solution will work well from Laravel 5.7 onwards

//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
Joinder answered 8/1, 2020 at 13:18 Comment(0)
P
0

I prefer the response helper myself:

    return response()->json(['message' => 'Yup. This request succeeded.'], 200);
Precursory answered 16/2, 2019 at 5:27 Comment(0)
F
-2
use Symfony\Component\HttpFoundation\Response;

  return response()->json([
            'message' => 'success',
            'status' => Response::HTTP_OK
        ]);
Frigg answered 24/2, 2023 at 23:50 Comment(2)
While this code snippet may be the solution, including a detailed explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion.Tameika
An "HTTP status code" is not "a plain code into the response payload"...Gaiety

© 2022 - 2024 — McMap. All rights reserved.