สมมติว่าคุณต้องการรับรายชื่อผู้ใช้โดยโทรGET
ไปapi/users
แต่ขณะนี้ตารางถูกตัดทอนจึงไม่มีผู้ใช้ คำตอบที่เหมาะสมสำหรับสถานการณ์นี้คืออะไร: 404
หรือ204
?
/api/users
/api/users/1
สมมติว่าคุณต้องการรับรายชื่อผู้ใช้โดยโทรGET
ไปapi/users
แต่ขณะนี้ตารางถูกตัดทอนจึงไม่มีผู้ใช้ คำตอบที่เหมาะสมสำหรับสถานการณ์นี้คืออะไร: 404
หรือ204
?
/api/users
/api/users/1
คำตอบ:
ฉันจะบอกว่าไม่ใช่
ควรสงวนรหัสสถานะ 404 ไว้สำหรับสถานการณ์ที่ไม่พบทรัพยากร ในกรณีนี้ทรัพยากรของคุณเป็นคอลเลกชันของผู้ใช้ คอลเล็กชันนี้มีอยู่ แต่ว่างเปล่า โดยส่วนตัวแล้วฉันจะสับสนมากในฐานะผู้เขียนไคลเอนต์สำหรับแอปพลิเคชันของคุณหากฉันได้รับ200
หนึ่งวันและ404
ในวันถัดไปเพียงเพราะมีคนบังเอิญลบผู้ใช้สองสามรายออก ฉันควรจะทำอย่างไร? URL ของฉันผิดหรือไม่? มีคนเปลี่ยน API และละเลยที่จะออกจากการเปลี่ยนเส้นทาง
นี่คือข้อความที่ตัดตอนมาจากคำอธิบายของรหัสสถานะ 204 โดย w3c
เซิร์ฟเวอร์ได้ดำเนินการตามคำขอแล้ว แต่ไม่จำเป็นต้องส่งคืนเอนทิตี - ร่างกายและอาจต้องการส่งคืนข้อมูลเมตาที่อัปเดต
แม้ว่ากรณีนี้อาจดูสมเหตุสมผล แต่ฉันคิดว่ามันจะทำให้ลูกค้าสับสนด้วย A 204
ควรระบุว่าการดำเนินการบางอย่างดำเนินการสำเร็จและไม่จำเป็นต้องส่งคืนข้อมูล นี่เป็นสิ่งที่สมบูรณ์แบบสำหรับการตอบสนองต่อDELETE
คำร้องขอหรืออาจเริ่มการทำงานของสคริปต์บางส่วนที่ไม่จำเป็นต้องส่งคืนข้อมูล ในกรณีนี้api/users
คุณมักจะคาดหวังว่าจะได้รับตัวแทนคอลเลกชันผู้ใช้ของคุณ การส่งเนื้อหาตอบกลับหนึ่งครั้งและไม่ส่งในเวลาอื่นนั้นไม่สอดคล้องกันและอาจทำให้เข้าใจผิดได้
ด้วยเหตุผลที่กล่าวถึงข้างต้น (ความสอดคล้องกัน) ฉันจะส่งคืนการแสดงคอลเล็กชันที่ว่างเปล่า สมมติว่าคุณใช้ XML เนื้อหาตอบสนองปกติสำหรับกลุ่มผู้ใช้ที่ไม่ว่างเปล่าอาจมีลักษณะดังนี้:
<users>
<user>
<id>1</id>
<name>Tom</name>
</user>
<user>
<id>2</id>
<name>IMB</name>
</user>
</users>
และหากรายการว่างเปล่าคุณสามารถตอบสนองต่อสิ่งนี้ได้ (ในขณะที่ยังใช้ a 200
):
<users/>
ไม่ว่าจะด้วยวิธีใดลูกค้าจะได้รับคำตอบที่เป็นไปตามรูปแบบที่รู้จักกันดี ไม่มีความสับสนที่ไม่จำเป็นและการตรวจสอบรหัสสถานะ นอกจากนี้ไม่มีการละเมิดข้อกำหนดรหัสสถานะ ทุกคนมีความสุข
คุณสามารถทำเช่นเดียวกันกับ JSON หรือ HTML หรือรูปแบบใดก็ได้ที่คุณใช้
[]
ที่มีอาร์เรย์ที่ว่างเปล่า
GET /singleCoin
- ส่งคืนเหรียญเดี่ยวแบบสุ่มจากกระเป๋าของคุณGET /severalCoins
- คืนเหรียญบางส่วนจากกระเป๋าของคุณที่คุณสามารถคว้าได้ในครั้งเดียว สมมติว่าตอนนี้คุณไม่มีเหรียญอยู่ในกระเป๋า เมื่อคุณขอGET /singleCoin
คุณจะได้รับ404 Not Found
แต่เมื่อคุณขอให้GET /severalCoins
คุณจะได้รับกับรายการที่ว่างเปล่า200 OK
[]
ข้อเท็จจริงประการหนึ่ง - คุณไม่มีเหรียญอธิบายด้วยคำตอบที่แตกต่างกันทำไม? ฉันจะบอกว่าดีกว่าเสมอที่จะได้รับ404 Not Found
เพราะไม่มีเหรียญในกระเป๋าของคุณ
GET /severalCoins
มันขึ้นอยู่กับสิ่งที่คุณหมายถึง หากคุณได้รับคำสั่งว่าGET /severalCoins
จะต้องคืนเหรียญบางส่วนก็ไม่ควรเป็น 200 เพราะมันไม่โอเค เซิร์ฟเวอร์ไม่สามารถจัดหาสิ่งที่ลูกค้าต้องการได้ สำหรับ/singleCoin
สิ่งนี้ชัดเจนเพราะลูกค้าต้องการเหรียญเดียวไม่มากไม่น้อย สิ่งนี้เหมือนกันสำหรับ/coins/7
. ในทางตรงกันข้ามกับ/coins
จุดสิ้นสุดโดยทั่วไปลูกค้าไม่คาดหวังเหรียญหนึ่งเหรียญหรือหลายเหรียญ ทั้งหมดนี้เป็นคำตอบที่ถูกต้อง ถ้าไม่มีเหรียญนี่คือสิ่งที่พวกเขาต้องการ มันเหมือน Emply List<Coin>
ใน Java แทนที่จะเป็นnull
.
ฉันจะตอบหนึ่งในสองรหัสขึ้นอยู่กับสถานการณ์รันไทม์:
404 (ไม่พบ)
คำตอบนี้ค่อนข้างถูกต้องหากคุณไม่มีโต๊ะ ไม่ใช่แค่โต๊ะว่าง แต่ไม่มีตารางผู้ใช้ เป็นการยืนยันความคิดที่แน่นอน - ไม่มีทรัพยากร ตัวเลือกเพิ่มเติมคือการให้รายละเอียดเพิ่มเติมว่าเหตุใดตารางของคุณจึงไม่มีรหัสที่ละเอียดกว่านี้อีกสองสามรหัส แต่ 404 ค่อนข้างดีที่จะอ้างถึงสถานการณ์ที่คุณไม่มีโต๊ะจริงๆ
200 (ตกลง)
ทุกกรณีที่คุณมีตาราง แต่ว่างเปล่าหรือตัวประมวลผลคำขอของคุณกรองผลลัพธ์ทั้งหมดออก ซึ่งหมายความว่า 'คำขอของคุณถูกต้องทุกอย่างเรียบร้อย แต่คุณไม่ได้จับคู่ข้อมูลใด ๆ เพียงเพราะเราไม่มีข้อมูลหรือไม่มีข้อมูลที่ตรงกับคำขอของคุณ สิ่งนี้ควรแตกต่างจากคำตอบปฏิเสธความปลอดภัย ฉันยังโหวตให้ส่งคืน 200 ในสถานการณ์ที่คุณมีข้อมูลบางส่วนและโดยทั่วไปคุณได้รับอนุญาตให้เข้าถึงตาราง แต่ไม่สามารถเข้าถึงข้อมูลทั้งหมดที่ตรงกับคำขอของคุณได้ (ข้อมูลถูกกรองออกเนื่องจากความปลอดภัยระดับออบเจ็กต์ แต่โดยทั่วไปคุณได้รับอนุญาตให้ คำขอ).
หากคุณกำลังคาดหวังรายการวัตถุผู้ใช้ทางออกที่ดีที่สุดคือส่งคืนรายการว่าง ([]) ด้วย 200 OK แทนที่จะใช้การตอบสนอง 404 หรือ 204
404 หมายถึงไม่พบทรัพยากร แต่ทรัพยากรมีอยู่ และหากการตอบกลับมีสถานะ 404 คุณจะรู้ได้อย่างไรว่ารายการผู้ใช้ว่างหรือเต็ม
ต้อง200 OKพร้อมรายการว่าง
เหตุผล:ตารางว่างหมายความว่ามีตารางอยู่ แต่ไม่มีระเบียนใด ๆ
404 Not Foundหมายถึงไม่มีจุดสิ้นสุดที่ร้องขอ