คำเตือนใน REST API ไม่ใช่ข้อผิดพลาดร้ายแรง


9

ฉันมี REST API สำหรับ entpoinds บางตัวเช่น DELETE, POST หรือ PUT ฉันมีกฎการตรวจสอบที่สามารถส่งคืนข้อผิดพลาดได้

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

คำถาม : มีวิธีปฏิบัติที่ดีที่สุดสำหรับข้อผิดพลาดประเภทนี้หรือไม่?

คำถามรอง :

  • มี HTTP semantic ใด ๆ สำหรับพฤติกรรมที่ฉันสามารถใช้หรือไม่
  • ฉันจะยังคงทำตามแนวคิด REST (สำหรับฉันแล้วดูเหมือนว่าฉันจะทำ) - ฉันเก็บมันไว้ไร้สัญชาติ

คุณตัดสินใจได้อย่างไรว่าจะแสดงคำเตือนดังกล่าวกับผู้ใช้ คุณเรียกใช้ API ปลายทางเพื่อตรวจสอบสถานะแอปพลิเคชันจากนั้นนำเสนอผู้ใช้ดังกล่าวโต้ตอบโต้ตอบ UI จนกว่าผู้ใช้จะตอบสนอง จากนั้นคุณโทรจริง คุณควรทำสิ่งนี้กับ REST API ของคุณด้วย: เพิ่มจุดปลายเพื่อตรวจสอบว่ามันบันทึกเพื่อทำงานบางอย่างหรือไม่ วิธีนี้ผู้ใช้ API สามารถทำการตรวจสอบ "ก่อนบิน" และแม้แต่มอบอำนาจการตัดสินใจให้กับผู้ใช้ รหัสสถานะ HTTP ของคุณเป็นเหมือนrm /file"เตือน" ไฟล์จะถูกอ่านอย่างเดียวในขณะที่ลบทิ้งอยู่ดี
ลองจับได้ในที่สุด

สิ่งนี้เกิดขึ้นเมื่อธุรกิจมีการทับซ้อนกันกับรหัสสถานะโปรโตคอล อย่างไรก็ตาม. คุณพยายามใช้รหัสสถานะ HTTP ของคุณเองหรือ ถ้า Twitter ทำได้เช่นกัน ให้พูดเช่น 6xx อย่างไรก็ตามฉันรู้ว่าคุณสามารถเพิ่มข้อความลงในเนื้อหาการตอบสนองแม้ว่าจะเป็น 4xx (ช่วงใดที่จะได้รับการพิจารณาในกรณีของคุณ)
Laiv

ในที่สุดฉันก็ใช้ 409 CONFLICTคำเตือน ด้วยวิธีนี้ลูกค้าจะได้รับคำสั่งว่าสามารถบังคับให้การโทรด้วยปลายทางและเนื้อหาเดียวกันโดยใช้พารามิเตอร์พิเศษ "force = 1"
237329

คำตอบ:


4

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

สำหรับ REST API คุณต้องแจ้งสถานะของคำขอและวิธีการจัดการกับเซิร์ฟเวอร์ - คุณไม่สามารถส่ง PUT และคาดว่าจะเกิดข้อผิดพลาดหากไคลเอ็นต์ยังไม่เสร็จหรือประสบความสำเร็จหากมี - เซิร์ฟเวอร์จำเป็นต้องรู้สิ่งนี้ ข้อมูลเพื่อส่งกลับรหัสผลลัพธ์ที่ถูกต้อง

ดังนั้นคุณสามารถส่งการตั้งค่าสถานะ 'คำเตือนการปราบปราม' ด้วยคำขอของคุณหากไม่ได้ตั้งค่าเซิร์ฟเวอร์จะส่งคืนรหัสข้อผิดพลาด 409 (หรือคล้ายกัน) และหากตั้งไว้ให้ส่งคืนรหัส 200 แทน ไม่สามารถถามผู้ใช้ว่า 'คุณต้องการเปลี่ยนสถานะนี้หรือไม่' หลังจากส่งการเปลี่ยนแปลงสถานะแล้ว

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


ฉันไม่ได้บอกว่ามันเป็นสิ่งที่ถูกต้อง แต่รหัส 3xx อาจถูกมองว่าเป็นรหัสแจ้งเตือนหรือคำเตือนบางประเภทที่ลูกค้าอาจตัดสินใจดำเนินการต่อไป ที่กล่าวว่าฉันค่อนข้างจะดำเนินการหรือไม่และบางทีฉันอาจตอบกลับด้วยข้อมูลเพิ่มเติมในร่างกายที่กลับมาหรือในส่วนหัว
Archimedix

0

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

X-APP-STATUS: 422 Unprocessable entity
X-APP-SOURCE: Invalid ID 'fo0'

สิ่งนี้จะให้รหัสข้อมูลฝั่งไคลเอ็นต์ของคุณในการเตือนผู้ใช้หรือดำเนินการแก้ไขด้วยตนเอง


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