ลองนึกภาพ API เพื่อระบุว่าบุคคลได้เลือกสัตว์วิญญาณของพวกเขาหรือไม่ พวกมันมีสัตว์วิญญาณเป็นศูนย์หรือหนึ่งตัวเท่านั้น
ขณะนี้:
/person/{id}/selectedSpiritAnimal
เมื่อเลือกสัตว์แล้วจะคืนค่า http 200 และ {selectedAnimal:mole}
แต่เมื่อไม่มีสิ่งที่เลือกก็จะส่งคืน http 404
สิ่งนี้ทำให้สัตว์วิญญาณของฉันไม่มีความสุขเนื่องจากเราแสดงถึงข้อกังวลเกี่ยวกับโดเมนที่ถูกต้องซึ่งยังไม่ได้เลือกสัตว์วิญญาณ - เป็นข้อผิดพลาด HTTP
นอกจากนี้ในฐานะธุรกิจ - erm Sprit-Animal-Hampers-R-us - เราต้องการทราบเมื่อมีคนไม่มีตัวเลือกดังนั้นเราจึงสามารถแจ้งให้พวกเขาได้
การตอบสนองที่ดีกว่าคืออะไรที่นี่:
HTTP 200 และ {selectedAnimal:null}
หรือชัดเจนยิ่งขึ้น
HTTP 200 และ {selectedAnimal:null, spiritAnimalSelected: false}
หรือมันจะดีกว่าที่จะกลับ 404? เนื่องจากชอบมากthis image has not yet been uploaded
เมื่อดูภาพออนไลน์จะเป็น 404 this person has not selected a spirit animal
อาจเป็น 404
คำถามนี้ได้รับการเสนอเป็นคำถามซ้ำ แต่คำถามดังกล่าวตอบ URL ที่ถูกต้องเป็นอย่างอื่นเมื่อมีการกำหนดค่าแอปพลิเคชันให้ไม่อนุญาตให้มีการเปลี่ยนแปลง URL นั้น
ในที่นี้ฉันกำลังดูว่าใครเป็นตัวแทนของทรัพยากรที่การขาดทรัพยากรมีความหมาย คือมันถูกต้องสำหรับลูกค้าที่จะขอ URL และการตอบสนองคือคุณได้ขอทรัพยากรที่แสดงถึงการขาดสิ่งใด
ดังนั้นนี่ไม่ใช่ 'ตรรกะทางธุรกิจ' แต่เป็นกรณีที่ไม่มีสิ่งใดมีความหมาย (อาจเป็นเพราะเพื่อนร่วมงานของฉันหลายคนเถียงว่า 404 ยังคงถูกต้อง) แต่ฉันไม่แน่ใจว่าจะทำแผนที่นั้นกับ ข้อมูลจำเพาะ
เลือกคำตอบได้ยากมาก ฉันเปลี่ยนใจในการสนทนาหลายครั้งที่นี่และที่ทำงานต่อเนื่อง
สิ่งที่ settles สำหรับฉันที่นี่คือสเปคบอกว่า 4xx คือเมื่อลูกค้าได้ผิดพลาด ในกรณีนี้ไคลเอนต์ได้รับการบอกให้คาดหวังการตอบสนองจาก URL ที่เลือกSpiritAnimalดังนั้นจึงไม่ผิดพลาด
ฉันทามติในหมู่เพื่อนร่วมงานของฉันคือนี่เป็นอาการของการออกแบบ API ที่ไม่ดี
น่าจะดีกว่าที่เราเพียงแค่ขอ / person / {id} และส่งคืนชุดของความสัมพันธ์ลิงก์สำหรับบุคคล ... ถ้าคุณไม่ได้รับลิงค์ / selectSpiritAnimal (เมื่อบุคคลไม่มีตัวเลือก) แต่คุณ เรียกมันว่าต่อไปแล้ว 404 ก็สมเหตุสมผลแล้ว หรือว่าคุณใช้การตอบสนองบางส่วนและให้ / person / {id} ส่งคืนเอกสารที่สมบูรณ์ยิ่งขึ้นเว้นแต่ลูกค้าร้องขอชุดย่อยของข้อมูล