ในการเปรียบเทียบ REST [api] โครงสร้างกับโมเดล OO ฉันเห็นความคล้ายคลึงกันเหล่านี้:
ทั้งสอง:
กำลังมุ่งเน้นข้อมูล
- REST = ทรัพยากร
- OO = วัตถุ
ล้อมรอบการดำเนินงานรอบข้อมูล
- REST = ล้อมรอบ VERBS (รับ, โพสต์, ... ) รอบ ๆ แหล่งข้อมูล
- OO = ส่งเสริมการดำเนินการรอบ ๆ วัตถุโดยห่อหุ้ม
อย่างไรก็ตามแนวปฏิบัติที่ดีของ OO นั้นไม่ได้อยู่บน REST apis เสมอเมื่อพยายามใช้รูปแบบซุ้มเช่นใน REST คุณไม่มีตัวควบคุม 1 ตัวที่จะจัดการกับคำร้องขอทั้งหมดและคุณจะไม่ซ่อนความซับซ้อนของวัตถุภายใน
ในทางตรงกันข้าม REST ส่งเสริมการเผยแพร่ทรัพยากรของความสัมพันธ์ทั้งหมดกับทรัพยากรและอื่น ๆ ในรูปแบบอย่างน้อยสองรูปแบบ:
ผ่านความสัมพันธ์ลำดับชั้นของทรัพยากร (ผู้ติดต่อของ id 43 ประกอบด้วยที่อยู่ 453):
/api/contacts/43/addresses/453
ผ่านลิงก์ในการตอบสนอง REST json:
>> GET /api/contacts/43 << HTTP Response { id: 43, ... addresses: [{ id: 453, ... }], links: [{ favoriteAddress: { id: 453 } }] }
กลับมาที่ OO รูปแบบการออกแบบซุ้มเคารพLow Coupling
ระหว่างobjectAและ ' objectB client ' และHigh Cohesion
สำหรับobjectAนี้และการประกอบวัตถุภายใน ( objectC , objectD ) ด้วยอินเตอร์เฟสobjectAสิ่งนี้อนุญาตให้ผู้พัฒนา จำกัด ผลกระทบต่อobjectBของการเปลี่ยนแปลงภายในobjectA (ในobjectCและobjectD ) ตราบใดที่objectA api (การทำงาน) ยังคงได้รับการเคารพ
ใน REST ข้อมูล (ทรัพยากร) ความสัมพันธ์ (ลิงก์) และพฤติกรรม (คำกริยา) จะถูกกระจายในองค์ประกอบต่าง ๆ และพร้อมใช้งานบนเว็บ
เล่นกับ REST ฉันมักจะมีผลกระทบต่อการเปลี่ยนแปลงรหัสระหว่างไคลเอนต์และเซิร์ฟเวอร์ของฉัน: เนื่องจากฉันมีHigh Coupling
ระหว่างBackbone.js
คำขอและLow Cohesion
ระหว่างทรัพยากร
ฉันไม่เคยคิดวิธีที่จะให้Backbone.js javascript application
ข้อตกลงของฉันกับการค้นพบ " ทรัพยากรและคุณสมบัติ REST " ที่ได้รับการโปรโมตโดยลิงก์ REST ฉันเข้าใจว่า WWW นั้นให้บริการโดยเซิร์ฟเวอร์หลายเครื่องและองค์ประกอบ OO จะต้องถูกระเบิดเพื่อให้บริการโดยโฮสต์หลายแห่งในนั้น แต่สำหรับสถานการณ์แบบง่าย ๆ เช่น "บันทึก" หน้าที่แสดงรายชื่อที่อยู่ ท้ายที่สุดฉัน:
GET /api/contacts/43?embed=(addresses) [save button pressed] PUT /api/contacts/43 PUT /api/contacts/43/addresses/453
ซึ่งทำให้ฉันย้ายการบันทึกการกระทำของอะตอมในแอปพลิเคชั่นเบราว์เซอร์บันทึก (เนื่องจากทรัพยากรสามารถแยกกันได้สองทรัพยากร)
ด้วยความคิดนี้หากฉันไม่สามารถทำให้การพัฒนาของฉันง่ายขึ้น (รูปแบบการออกแบบซุ้มไม่สามารถใช้งานได้) และถ้าฉันนำความซับซ้อนมาสู่ลูกค้าของฉันมากขึ้น (จัดการกับการบันทึกอะตอมของทรานแซคชัน)
PUT /api/contacts/43
เรียงซ้อนการปรับปรุงสำหรับวัตถุภายในคืออะไร? ฉันมี API จำนวนมากที่ได้รับการออกแบบเช่นนี้ (URL หลักอ่าน / สร้าง / อัปเดต "ทั้ง" และ URL ย่อยอัปเดตชิ้นส่วน) เพียงตรวจสอบให้แน่ใจว่าคุณไม่ได้อัปเดตที่อยู่เมื่อไม่ต้องการการเปลี่ยนแปลง (สำหรับเหตุผลด้านประสิทธิภาพ)