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 \ ตัวแทน \ HttpFoundation \ ตอบสนองมีค่าคงที่ที่กำหนดไว้ล่วงหน้าของตัวเองสำหรับ http รหัสสถานะและถ้าคุณใช้อื่นที่ไม่ใช่ว่ามันจะเปลี่ยนสถานะของคุณเป็นสิ่งที่ใกล้เคียงกับมัน ... เช่นถ้าคุณต้องการสถานะชุด449 , คุณจะได้รับสถานะ500
Mladen Janjetovic

2
@Tushar จะทำอย่างไรถ้าฉันไม่ต้องการส่งข้อมูลใด ๆ กลับเพียงแค่ตอบกลับ 200 ครั้ง คือresponse()->json([], 200);เหมาะสมกับวัตถุประสงค์ในสถานการณ์เช่นนี้? หรือ 200 นัย?
Jonathan

+ (201) คำตอบนี้ทำให้เย็นของฉันปลอดภัย :)
maytham-ɯɐɥʇʎɐɯ

use Illuminate\Http\Response;และreturn new Response(['message' => 'test'], 422);ทำงานให้ฉัน
Derk Jan Speelman

65

นี่คือวิธีที่ฉันทำใน Laravel 5

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

หรือใช้ฟังก์ชันตัวช่วย:

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

1
@timeNomad ข้อดีข้อเสียของสองวิธีนี้คืออะไรแนะนำอย่างไร?
DJC

2
@DJC ในวิธีแรกคุณจะสามารถใช้การตอบสนอง :: หลายครั้งโหลดเพียงครั้งเดียว ในวิธีที่สองคุณจะเรียกคลาสนั้นทุกครั้งที่คุณใช้ response () -> (ไม่มีปัญหาถ้าคุณจะใช้เพียงวิธีเดียว)
Marcelo Agimóvel

33

ฉันคิดว่าเป็นแนวทางปฏิบัติที่ดีกว่าที่จะให้คำตอบของคุณอยู่ภายใต้การควบคุมเพียงครั้งเดียวและด้วยเหตุนี้ฉันจึงค้นพบวิธีแก้ปัญหาที่เป็นทางการที่สุด

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

เพิ่มสิ่งนี้หลังจากnamespaceการประกาศ:

use Illuminate\Http\Response;

ขอบคุณฉันกำลังมองหาข้อมูลอ้างอิงนี้ คุณมีลิงก์ไปยังชื่อการตอบกลับอื่น ๆ เช่น 201, 400 เป็นต้นไม่ใช่แค่ 200 (HTTP_OK) หรือไม่? ฉันได้ลองใช้ googling แล้ว แต่ยังหาไม่เจอ!
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 model การส่งคืนแบบธรรมดาจะถูกแปลงโดยอัตโนมัติใน JSONตามค่าเริ่มต้นเช่น

return User::all();

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

หวังว่าคำตอบของฉันจะเป็นประโยชน์



0

มันจะดีกว่าที่จะทำกับฟังก์ชั่นผู้ช่วยมากกว่า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

laravel 7. * คุณไม่จำเป็นต้องพูดออกเสียง JSON RESPONSEเพราะจะถูกแปลงเป็นJSONโดยอัตโนมัติ

return response(['Message'=>'Wrong Credintals'], 400);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.