รหัสสถานะการตอบกลับที่เหมาะสมคือ POST เมื่อไม่พบทรัพยากรหลัก


10

ฉันมีจุดสิ้นสุดดังต่อไปนี้:

a/{id}/b

และต้องการสร้างbพร้อมกับส่งPOSTคำขอไปยังมัน ถ้าaมีให้{id}ไม่ได้พบว่าผมควรจะตอบสนองด้วย404 NOT_FOUNDหรืออาจจะมี409 CONFLICT?

มันคือการจัดการธรรมดาa/{id}เคล็ดลับคือที่นี่มีการใช้แหล่งข้อมูลย่อย


เป็นไปได้ที่ซ้ำกันของวิธีจัดการกฎธุรกิจด้วย REST API
ริ้น

คำตอบ:


15

404 NOT FOUNDดูเหมือนเป็นการตอบสนองที่เหมาะสมเนื่องจากไม่มีทรัพยากรที่มี ID นี้ มันชัดเจนมากที่จะเข้าใจและคุณคาดหวังว่าจะได้รับคำตอบเหมือนกันถ้าa/{id}ถูกเรียก

409 CONFLICTดูเหมือนจะไม่ใช่ตัวเลือกที่ดีกว่าเพราะในตัวอย่างของคุณคุณจะคืนค่า 409 เมื่อไม่พบทรัพยากรหลัก:)

แต่โปรดจำไว้ว่าสิ่งที่สำคัญที่สุดนั้นสอดคล้องกันใน API ของคุณ


ฉันเห็นด้วย. หากคุณพยายามที่จะเขียนไปยังโฟลเดอร์ที่ไม่มีอยู่มันเป็นความขัดแย้งหรือข้อผิดพลาดโฟลเดอร์ที่ขาดหายไปหรือไม่? ดูเหมือนจะง่ายกว่าสำหรับฉัน
Neil

"โฟลเดอร์" คุณหมายถึงเส้นทางที่ไม่มีอยู่หรือไม่?
Dherik

ฉันหมายถึงโฟลเดอร์เช่นเดียวกับในระบบไฟล์
Neil

คุณช่วยอธิบายรายละเอียดของสถานการณ์ได้ไหม เพราะมันขึ้นอยู่กับ หากคาดว่าโฟลเดอร์สำหรับเซิร์ฟเวอร์และ (ไม่ว่าจะด้วยเหตุผลใดก็ตาม) อยู่ที่นั่นฉันคิดว่านี่เป็นข้อผิดพลาดเซิร์ฟเวอร์ (5xx) ไม่ใช่ข้อผิดพลาดไคลเอนต์ (4xx) หากค่าของโฟลเดอร์นี้ถูกส่งโดยไคลเอนต์ไปยังทรัพยากร (ตามid) คือ 404 แต่ถ้าโฟลเดอร์ถูกส่งผ่านในเนื้อความสิ่งนี้อาจเป็นอย่างอื่น (412, 422 ... บางสิ่งบางอย่างเพื่อแทน "การตรวจสอบความถูกต้องล้มเหลว: โฟลเดอร์ไม่ ไม่มีอยู่ ") เป็นคำถามที่ดีในการถามและพูดคุย
Dherik

หากคุณขอให้เซิร์ฟเวอร์หาไฟล์ที่มีพา ธ /nonexistent/help.html และไม่มีโฟลเดอร์ / ไม่มีอยู่มีการตอบกลับที่ชัดเจนเพียงเรื่องเดียว ไม่พบไฟล์ 404! อาจมี /home/help.html อยู่ด้วยและการตอบกลับจะไม่แตกต่างกัน นี่เป็นแอปพลิเคชัน REST อย่างชัดเจน แต่ฉันไม่เห็นเหตุผลที่เหตุผลจะเปลี่ยน พาเรนต์ต้องมีอยู่ก่อน
Neil

4

นอกจากคำตอบของ @ Dherik

URIs เป็นตัวระบุดังนั้นเราต้องจำไว้ว่า ( /a/{id}/bเป็นตัวระบุ) URIเป็นความหมายสำหรับ WWW และอื่น ๆ สำหรับลูกค้าของ HTTP

404เป็นคำตอบที่ถูกต้อง โดยพื้นฐานแล้วเซิร์ฟเวอร์กำลังตอบรับ

ฉันไม่พบทรัพยากรใด ๆ ที่มีรหัสดังกล่าว ไม่พบทรัพยากร 1

ไม่ว่าจะเป็นทรัพยากรที่ขาดหายไปเป็นผู้ปกครองหรือเด็กไม่สำคัญ

เราพัฒนาให้ดูลำดับชั้นและเส้นทางใน URI แต่ HTTP ลูกค้าไม่ได้ กล่าวอีกนัยหนึ่ง HTTP นั้นหมายถึงการตีความโดยไคลเอนต์ HTTP เท่านั้น แต่ไม่ใช่โดยมนุษย์ (devs, end-users, etc)

ในกรณีที่มีข้อสงสัยอย่าถามรหัสที่เหมาะสมสำหรับคุณ (คน) ถามว่ารหัสใดที่เหมาะสมสำหรับไคลเอ็นต์ HTTP คุณต้องการให้ไคลเอ็นต์ HTTP ทำงานอย่างไร

ทำไม? เนื่องจากรหัสสถานะบางตัวทำให้ไคลเอนต์เหล่านี้ดำเนินการบางอย่าง ยกตัวอย่างเช่น302 รหัสนี้โดยปกติจะทำให้เว็บเบราว์เซอร์เปลี่ยนเส้นทางไปยังตำแหน่งที่ระบุ (URI) ที่แจ้งไว้ในส่วนหัวการตอบกลับ

นี่อาจไม่ใช่กรณีของคุณ แต่สิ่งสำคัญที่ควรระวัง ในที่สุดรหัสสถานะ HTTP จะถูกส่งไปยังไคลเอนต์ HTTP ไม่ใช่แอปพลิเคชันของเรา ไม่ให้กับบุคคล


1: 409ไม่ค่อยมีการนำมาใช้เนื่องจากข้อผิดพลาดในการนำทาง มันมักจะเกี่ยวข้องกับการดำเนินการของการดำเนินการระยะไกล (ลบอัพเดทใหม่ ฯลฯ ) แต่ควรมี URI มิฉะนั้น 404 จะเหนือกว่า

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