Laravel - 返回带有HTTP状态码的JSON

122
如果我返回一个对象:
return Response::json([
    'hello' => $value
]);

状态码将为200。如何将其更改为201,并在JSON对象中附上消息发送?

我不知道是否有一种方法可以仅在Laravel中设置状态代码。

10个回答

151

您可以使用http_response_code()设置HTTP响应代码。

如果您不传递任何参数,http_response_code将获取当前的状态码。如果您传递一个参数,则会设置响应代码。

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

对于Laravel(参考来源:https://dev59.com/RW7Xa4cB1Zd3GeqPlxVJ#14717895):

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

3
请记住,Symfony\Component\HttpFoundation\Response具有其自己预定义的HTTP状态代码常量,如果您使用不同的代码,它会将您的状态更改为接近的状态...例如,如果您想设置状态码449,您将始终获得状态码500。 - Mladen Janjetovic
2
@Tushar 如果我不想发送任何数据,只想返回一个200响应怎么办?在这种情况下,response()->json([], 200); 是否适用?或者200是隐含的吗? - Jonathan
+(201)这个答案解决了我的晚上 :) - Maytham Fahmi
1
使用 Illuminate\Http\Response; 以及 return new Response(['message' => 'test'], 422); 对我来说都起作用了。 - Derk Jan Speelman

91

这是我在Laravel 5中的实现方式

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

或者使用辅助函数:

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

1
@timeNomad 这两种方法的优缺点是什么 - 哪种更推荐? - DJC
2
@DJC 在第一种方法中,您将能够使用 Response:: 仅加载一次并多次调用。在第二种方法中,每次使用 response()-> 时,您将调用该类(如果您只使用一个,则没有问题)。 - Marcelo Agimóvel

48

我认为最好的做法是将你的回应集中在一个控制下,因此我找到了最官方的解决方案。

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

namespace声明后添加以下内容:

use Illuminate\Http\Response;

谢谢,我一直在寻找这个参考。你有其他可用响应名称的链接吗?例如201、400等而不仅仅是200(HTTP_OK)?我已经尝试过谷歌搜索,但还没有找到! - jjmu15
1
算了,我找到了。这里是一个完整的列表,供其他可能在寻找的人使用:https://gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798 - jjmu15

16

有多种方法

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

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

STATUS_CODE是你想要发送的HTTP状态码。两者相同。

如果你正在使用Eloquent模型,那么简单的返回语句也会默认自动转换为JSON格式,如下所示:

return User::all();

如何在返回Eloquent模型或资源时设置状态码? - undefined

6

Laravel 7.*

您无需指定JSON响应,因为它会自动将其转换为JSON

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

3
return response(['title' => trans('web.errors.duplicate_title')], 422); //Unprocessable Entity

希望我的回答对您有所帮助。

这个很有帮助!谢谢 :) - Faiyaj

2

我经常使用这种类型的JSON响应格式,它可以帮助您...

return response()->json(['success'=>'true','message' => 'Successfully Done.'], 200);

1

最好使用辅助函数而不是Facades。这个解决方案从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

我个人更喜欢使用响应助手:

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

-2
use Symfony\Component\HttpFoundation\Response;

  return response()->json([
            'message' => 'success',
            'status' => Response::HTTP_OK
        ]);

1
虽然这段代码片段可能是解决方案,但包括详细的解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 - Shawn Hemelstrand
“HTTP状态码”并不是“简单地将代码放入响应有效负载中”... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接