รหัสสถานะ HTTP ที่เหมาะสมที่สุดสำหรับหน้าข้อผิดพลาด“ ไม่พบรายการ” คืออะไร


117

ฉันสงสัยว่ารหัสสถานะ HTTP ที่เหมาะสมที่สุดสำหรับหน้า "ไม่มีรายการ" คืออะไร

ถ้าไม่มีหน้านั้นฉันจะใช้ 404 อย่างชัดเจนอย่างไรก็ตามหน้าหนึ่งของฉันมีuseridอาร์กิวเมนต์ (เป็นหน้า "แก้ไขผู้ใช้") และในกรณีที่ไม่มีผู้ใช้ที่มี ID ผู้ใช้ที่ระบุอยู่ฉันกำลังแสดง หน้าข้อผิดพลาด แต่ฉันต้องการส่งส่วนหัวสถานะ 4xx ด้วย (เนื่องจาก "200 OK" ไม่พอดีจริงๆ)

ฉันเดาว่า 404 น่าจะใช้ได้เพราะมัน "ไม่พบ" ไม่ใช่ "ไม่พบไฟล์" แต่ฉันสงสัยว่ามีรหัสที่ดีกว่าสำหรับกรณีนี้หรือไม่

คำตอบ:


140

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


14
ประณามคุณที่ให้คำแนะนำที่ดี :( OCD ถึงไม่ใช่ 404 ทุกสิ่งเป็นของจริง
Carrie Kendall

16
ข้อผิดพลาด 404 ค่อนข้างคลุมเครือสำหรับการแยกความแตกต่างของ URI ที่ไม่ถูกต้องและไม่พบเอนทิตี จำเป็นต้องมีรหัสมาตรฐานใหม่ในการแยกความแตกต่างของ 404
Breakskater

2
ฉันชอบส่งคืนเนื้อหาว่างเปล่า 204 รายการมากกว่าการส่งคืนรหัสสถานะ
ambigus

46

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

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


1
จะเกิดอะไรขึ้นถ้าฉันต้องการอัปเดต foo object ด้วย id = 1 และไม่มี foo ในฐานข้อมูลด้วย id นี้
valijon

1
ในสถานการณ์นี้คุณมีปัญหาการทำงานพร้อมกันที่ต้องแก้ไข: หากคุณดึงอ็อบเจ็กต์ที่มี id = 1 และไม่มีอยู่อีกต่อไปเมื่อคุณพยายามอัปเดตเธรดหรือกระบวนการอื่นบางส่วนไม่สนใจการล็อกของคุณ (หรือคุณไม่ได้ตั้งค่าไว้) และลบทิ้ง นั่นไม่ดี หรือหากคุณกำลังพยายามอัปเดตอ็อบเจ็กต์ id = n (โดยที่ n มีให้กับคุณ) โดยไม่ได้ตรวจสอบก่อนแสดงว่าคุณไม่มีขั้นตอนการตรวจสอบความถูกต้องในตรรกะการอัปเดตซึ่งก็ไม่ดีเช่นกัน
Eight-Bit Guru


8

ขึ้นอยู่กับว่า userid เป็นตัวระบุทรัพยากรหรือพารามิเตอร์เพิ่มเติม หากเป็นเช่นนั้นก็สามารถส่งคืน 404 ได้หากไม่ใช่คุณอาจส่งคืนรหัสอื่นเช่น

400 (bad request) ‐ indicates a bad request
หรือ
412 (Precondition Failed) e.g. conflict by performing conditional update

ข้อมูลเพิ่มเติมในหนังสือ InfoQ Explores: RESTฟรี


1
การพูดว่า "พารามิเตอร์เพิ่มเติม" คุณหมายถึงช่องส่วนหัวของคำขอหรือไม่ มิฉะนั้นฉันจะไม่แนะนำให้ใช้ 412 "รหัสสถานะ 412 (Precondition Failed) ระบุว่าเงื่อนไขอย่างน้อยหนึ่งเงื่อนไขที่ระบุในฟิลด์ส่วนหัวของคำขอถูกประเมินว่าเป็นเท็จเมื่อทดสอบบนเซิร์ฟเวอร์"
oferei

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