Laravel - Trả về json cùng với mã trạng thái http


85

Nếu tôi trả về một đối tượng:

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

mã trạng thái sẽ là 200. Làm thế nào tôi có thể thay đổi nó thành 201, với một tin nhắn và gửi nó với đối tượng json ?.

Tôi không biết có cách nào để chỉ đặt mã trạng thái trong Laravel không.

Câu trả lời:


114

Bạn có thể sử dụng http_response_code()để đặt mã phản hồi HTTP.

Nếu bạn không có tham số nào thì http_response_code sẽ nhận được mã trạng thái hiện tại. Nếu bạn chuyển một tham số, nó sẽ đặt mã phản hồi.

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

Đối với Laravel (Tham khảo từ: https://stackoverflow.com/a/14717895/2025923 ):

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

3
Hãy nhớ rằng Symfony \ Component \ HttpFoundation \ Response có các hằng số được xác định trước riêng cho mã trạng thái http và nếu bạn sử dụng các hằng số khác, nó sẽ thay đổi trạng thái của bạn thành một thứ gì đó gần với nó ... tức là nếu bạn muốn đặt trạng thái 449 , bạn sẽ luôn có được trạng thái 500
Mladen Janjetovic

2
@Tushar thì sao nếu tôi không muốn gửi lại bất kỳ dữ liệu nào, chỉ là 200 phản hồi? Có response()->json([], 200);phù hợp với mục đích trong tình huống này không? Hay là 200 ẩn?
Jonathan

+ (201) câu trả lời này an toàn cho buổi tối của tôi :)
maytham-ɯɐɥʇʎɐɯ

use Illuminate\Http\Response;return new Response(['message' => 'test'], 422);làm việc cho tôi
Derk Jan Speelman

64

Đây là cách tôi thực hiện trong Laravel 5

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

Hoặc sử dụng chức năng trợ giúp:

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

1
@timeNomad Ưu và nhược điểm của hai phương pháp này là gì - phương pháp nào được khuyến nghị?
DJC

2
@DJC trên phương pháp đầu tiên, bạn sẽ có thể sử dụng Response :: nhiều lần chỉ tải một lần. Ở phương thức thứ hai, bạn sẽ gọi lớp đó mỗi khi bạn sử dụng response () -> (không vấn đề gì nếu bạn chỉ sử dụng một).
Marcelo Agimóvel

32

Tôi nghĩ rằng tốt hơn hết là bạn nên kiểm soát phản hồi của mình và vì lý do này, tôi đã tìm ra giải pháp chính thức nhất.

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

thêm cái này sau khi namespacekhai báo:

use Illuminate\Http\Response;

Cảm ơn, tôi đã tìm kiếm một tài liệu tham khảo cho điều này. Bạn có tình cờ có liên kết đến các tên phản hồi có sẵn khác như 201, 400, v.v. và không chỉ 200 (HTTP_OK) không? Tôi đã thử googling nó nhưng vẫn chưa thể tìm thấy nó!
jjmu15

1
Đừng bận tâm ... đã tìm thấy nó. Đây là danh sách đầy đủ cho những ai khác có thể đang tìm kiếm nó: gist.github.com/jeffochoa/a162fc4381d69a2d862dafa61cda0798
jjmu15

12

Có nhiều cách

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

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

trong đó STATUS_CODE là mã trạng thái HTTP mà bạn muốn gửi. Cả hai đều giống hệt nhau.

nếu bạn đang sử dụng mô hình Eloquent, thì trả về đơn giản cũng sẽ được tự động chuyển đổi trong JSON theo mặc định như,

return User::all();

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

Hy vọng câu trả lời của tôi là hữu ích.


0

Bản thân tôi thích trình trợ giúp phản hồi:

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

0

Tốt hơn nên làm điều đó với các chức năng trợ giúp hơn là Mặt tiền . Giải pháp này sẽ hoạt động tốt từ Laravel 5.7 trở đi

//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. * Bạn không cần phải nói JSON RESPONSE vì nó sẽ tự động chuyển nó thành JSON

return response(['Message'=>'Wrong Credintals'], 400);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.