การตอบสนอง REST ที่เหมาะสมสำหรับตารางว่าง?


107

สมมติว่าคุณต้องการรับรายชื่อผู้ใช้โดยโทรGETไปapi/usersแต่ขณะนี้ตารางถูกตัดทอนจึงไม่มีผู้ใช้ คำตอบที่เหมาะสมสำหรับสถานการณ์นี้คืออะไร: 404หรือ204?


19
ฉันจะตอบกลับด้วย 200 และคอลเลกชันที่ว่างเปล่า (ไม่ใช่เนื้อหาตอบกลับที่ว่างเปล่า แต่เป็นคอลเล็กชันที่ไม่มีองค์ประกอบอยู่ภายในสิ่งนี้จะดูแตกต่างกันไปตามรูปแบบที่ส่งคืน)
toniedzwiedz

4
404 ในบริบทนี้น่าจะเหมาะกว่าสำหรับ 'table not found' ฉันจะบอกว่าคืนรายการว่างเปล่า
mata


2
@EJoshuaS มันไม่ใช่ คำถามทั้งสองเป็นของฉันและเก่ามาก คล้ายกัน แต่ไม่ซ้ำกัน
IMB

1
@EJoshuaS เห็นได้ชัดว่าพวกเขาไม่ซ้ำกัน คำถามนี้เป็นคำถามเกี่ยวกับในขณะที่หนึ่งเป็นเรื่องเกี่ยวกับ/api/users /api/users/1
Franklin Yu

คำตอบ:


233

ฉันจะบอกว่าไม่ใช่

ทำไมไม่ 404 (ไม่พบ)?

ควรสงวนรหัสสถานะ 404 ไว้สำหรับสถานการณ์ที่ไม่พบทรัพยากร ในกรณีนี้ทรัพยากรของคุณเป็นคอลเลกชันของผู้ใช้ คอลเล็กชันนี้มีอยู่ แต่ว่างเปล่า โดยส่วนตัวแล้วฉันจะสับสนมากในฐานะผู้เขียนไคลเอนต์สำหรับแอปพลิเคชันของคุณหากฉันได้รับ200หนึ่งวันและ404ในวันถัดไปเพียงเพราะมีคนบังเอิญลบผู้ใช้สองสามรายออก ฉันควรจะทำอย่างไร? URL ของฉันผิดหรือไม่? มีคนเปลี่ยน API และละเลยที่จะออกจากการเปลี่ยนเส้นทาง

ทำไมไม่ 204 (ไม่มีเนื้อหา)?

นี่คือข้อความที่ตัดตอนมาจากคำอธิบายของรหัสสถานะ 204 โดย w3c

เซิร์ฟเวอร์ได้ดำเนินการตามคำขอแล้ว แต่ไม่จำเป็นต้องส่งคืนเอนทิตี - ร่างกายและอาจต้องการส่งคืนข้อมูลเมตาที่อัปเดต

แม้ว่ากรณีนี้อาจดูสมเหตุสมผล แต่ฉันคิดว่ามันจะทำให้ลูกค้าสับสนด้วย A 204ควรระบุว่าการดำเนินการบางอย่างดำเนินการสำเร็จและไม่จำเป็นต้องส่งคืนข้อมูล นี่เป็นสิ่งที่สมบูรณ์แบบสำหรับการตอบสนองต่อDELETEคำร้องขอหรืออาจเริ่มการทำงานของสคริปต์บางส่วนที่ไม่จำเป็นต้องส่งคืนข้อมูล ในกรณีนี้api/usersคุณมักจะคาดหวังว่าจะได้รับตัวแทนคอลเลกชันผู้ใช้ของคุณ การส่งเนื้อหาตอบกลับหนึ่งครั้งและไม่ส่งในเวลาอื่นนั้นไม่สอดคล้องกันและอาจทำให้เข้าใจผิดได้

ทำไมฉันถึงใช้ 200 (ตกลง)

ด้วยเหตุผลที่กล่าวถึงข้างต้น (ความสอดคล้องกัน) ฉันจะส่งคืนการแสดงคอลเล็กชันที่ว่างเปล่า สมมติว่าคุณใช้ XML เนื้อหาตอบสนองปกติสำหรับกลุ่มผู้ใช้ที่ไม่ว่างเปล่าอาจมีลักษณะดังนี้:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

และหากรายการว่างเปล่าคุณสามารถตอบสนองต่อสิ่งนี้ได้ (ในขณะที่ยังใช้ a 200):

<users/>

ไม่ว่าจะด้วยวิธีใดลูกค้าจะได้รับคำตอบที่เป็นไปตามรูปแบบที่รู้จักกันดี ไม่มีความสับสนที่ไม่จำเป็นและการตรวจสอบรหัสสถานะ นอกจากนี้ไม่มีการละเมิดข้อกำหนดรหัสสถานะ ทุกคนมีความสุข

คุณสามารถทำเช่นเดียวกันกับ JSON หรือ HTML หรือรูปแบบใดก็ได้ที่คุณใช้


4
เห็นด้วยอย่างแน่นอน และสำหรับส่วนที่เหลือผมก็จะส่งกลับรหัสสถานะของ 200 []ที่มีอาร์เรย์ที่ว่างเปล่า
Chad Johnson

มีเหตุผล. ไม่จำเป็นต้องทำให้มันยากขึ้น 404 คงจะสับสน
Witold Kaczurba

ให้สมมติว่า API ที่อธิบายเหรียญในกระเป๋าของคุณโดยมีจุดสิ้นสุด: GET /singleCoin- ส่งคืนเหรียญเดี่ยวแบบสุ่มจากกระเป๋าของคุณGET /severalCoins- คืนเหรียญบางส่วนจากกระเป๋าของคุณที่คุณสามารถคว้าได้ในครั้งเดียว สมมติว่าตอนนี้คุณไม่มีเหรียญอยู่ในกระเป๋า เมื่อคุณขอGET /singleCoinคุณจะได้รับ404 Not Foundแต่เมื่อคุณขอให้GET /severalCoinsคุณจะได้รับกับรายการที่ว่างเปล่า200 OK []ข้อเท็จจริงประการหนึ่ง - คุณไม่มีเหรียญอธิบายด้วยคำตอบที่แตกต่างกันทำไม? ฉันจะบอกว่าดีกว่าเสมอที่จะได้รับ404 Not Foundเพราะไม่มีเหรียญในกระเป๋าของคุณ
sempasha

1
@sempasha GET /severalCoinsมันขึ้นอยู่กับสิ่งที่คุณหมายถึง หากคุณได้รับคำสั่งว่าGET /severalCoins จะต้องคืนเหรียญบางส่วนก็ไม่ควรเป็น 200 เพราะมันไม่โอเค เซิร์ฟเวอร์ไม่สามารถจัดหาสิ่งที่ลูกค้าต้องการได้ สำหรับ/singleCoinสิ่งนี้ชัดเจนเพราะลูกค้าต้องการเหรียญเดียวไม่มากไม่น้อย สิ่งนี้เหมือนกันสำหรับ/coins/7. ในทางตรงกันข้ามกับ/coinsจุดสิ้นสุดโดยทั่วไปลูกค้าไม่คาดหวังเหรียญหนึ่งเหรียญหรือหลายเหรียญ ทั้งหมดนี้เป็นคำตอบที่ถูกต้อง ถ้าไม่มีเหรียญนี่คือสิ่งที่พวกเขาต้องการ มันเหมือน Emply List<Coin>ใน Java แทนที่จะเป็นnull.
Franklin Yu

15

ฉันจะตอบหนึ่งในสองรหัสขึ้นอยู่กับสถานการณ์รันไทม์:

404 (ไม่พบ)

คำตอบนี้ค่อนข้างถูกต้องหากคุณไม่มีโต๊ะ ไม่ใช่แค่โต๊ะว่าง แต่ไม่มีตารางผู้ใช้ เป็นการยืนยันความคิดที่แน่นอน - ไม่มีทรัพยากร ตัวเลือกเพิ่มเติมคือการให้รายละเอียดเพิ่มเติมว่าเหตุใดตารางของคุณจึงไม่มีรหัสที่ละเอียดกว่านี้อีกสองสามรหัส แต่ 404 ค่อนข้างดีที่จะอ้างถึงสถานการณ์ที่คุณไม่มีโต๊ะจริงๆ

200 (ตกลง)

ทุกกรณีที่คุณมีตาราง แต่ว่างเปล่าหรือตัวประมวลผลคำขอของคุณกรองผลลัพธ์ทั้งหมดออก ซึ่งหมายความว่า 'คำขอของคุณถูกต้องทุกอย่างเรียบร้อย แต่คุณไม่ได้จับคู่ข้อมูลใด ๆ เพียงเพราะเราไม่มีข้อมูลหรือไม่มีข้อมูลที่ตรงกับคำขอของคุณ สิ่งนี้ควรแตกต่างจากคำตอบปฏิเสธความปลอดภัย ฉันยังโหวตให้ส่งคืน 200 ในสถานการณ์ที่คุณมีข้อมูลบางส่วนและโดยทั่วไปคุณได้รับอนุญาตให้เข้าถึงตาราง แต่ไม่สามารถเข้าถึงข้อมูลทั้งหมดที่ตรงกับคำขอของคุณได้ (ข้อมูลถูกกรองออกเนื่องจากความปลอดภัยระดับออบเจ็กต์ แต่โดยทั่วไปคุณได้รับอนุญาตให้ คำขอ).


10

หากคุณกำลังคาดหวังรายการวัตถุผู้ใช้ทางออกที่ดีที่สุดคือส่งคืนรายการว่าง ([]) ด้วย 200 OK แทนที่จะใช้การตอบสนอง 404 หรือ 204


2

คืน 200 แน่นอน

404 หมายถึงไม่พบทรัพยากร แต่ทรัพยากรมีอยู่ และหากการตอบกลับมีสถานะ 404 คุณจะรู้ได้อย่างไรว่ารายการผู้ใช้ว่างหรือเต็ม


  • "/ users" if ว่างควรคืนค่า "200"
  • '/ users / 1' หากไม่พบ id ควรส่งคืน 404

2

ต้อง200 OKพร้อมรายการว่าง

เหตุผล:ตารางว่างหมายความว่ามีตารางอยู่ แต่ไม่มีระเบียนใด ๆ

404 Not Foundหมายถึงไม่มีจุดสิ้นสุดที่ร้องขอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.