วิธีที่เหมาะสมของการซ้อนรีซอร์สในโมเดล REST คืออะไร?


14

ฉันออกแบบ REST API ของการบริการและติดอยู่กับวิธีที่เหมาะสมในการซ้อนทรัพยากร

ทรัพยากร: คู่ค้าตั๋วการตั้งค่า

การเชื่อมต่อระหว่างทรัพยากร:

  • พันธมิตรมีตั๋วหลายใบ
  • พันธมิตรมีการตั้งค่า

ตรรกะ Bussines:

  • คุณสามารถแสดงรายชื่อพันธมิตรทั้งหมดเป็นผู้ใช้ที่ไม่ระบุชื่อ
  • คุณสามารถเพิ่มตั๋วใหม่ให้กับพันธมิตรที่ระบุในฐานะผู้ใช้ที่ไม่ระบุชื่อ
  • พันธมิตรเท่านั้นที่สามารถแสดงตั๋วของเขา
  • พันธมิตรเท่านั้นที่สามารถแก้ไขตั๋วของเขาได้
  • พันธมิตรเท่านั้นที่สามารถแสดงรายการการตั้งค่า
  • พันธมิตรเท่านั้นที่สามารถแก้ไขการตั้งค่า

สิ่งที่ฉันทำจนถึงตอนนี้:

แหล่งข้อมูลพันธมิตร

GET / คู่ค้า - แสดงรายชื่อพันธมิตรทั้งหมด
GET / คู่ค้า /: id - แสดงรายละเอียดของพันธมิตรที่ระบุโดย: พารามิเตอร์ id
GET / คู่ค้า /: partner_id / ตั๋ว - รายการตั๋วของพันธมิตร
GET / คู่ค้า /: คู่ค้า / ตั๋ว /: id - รายละเอียด ของตั๋วของพันธมิตรที่ระบุ
POST / พันธมิตร /: partner_id / tickets - บันทึกตั๋ว
PUT ใหม่/ พันธมิตร /: partner_id / tickets /: id - อัปเดตตั๋วที่ระบุโดย: พารามิเตอร์ id
GET / คู่ค้า /: partner_id / การตั้งค่า - รายการพันธมิตร
PUT / partners /: partner_id / settings - อัปเดตการตั้งค่าของพันธมิตร

ปัญหา / คำถาม

มันจะเป็นวิธีที่เหมาะสมในการแยกทรัพยากรที่ซ้อนกัน (ตั๋วการตั้งค่า) เพื่อแยกทรัพยากรหรือทำซ้ำพวกเขาเป็นทรัพยากรที่แยกจากกัน?

เช่น

GET / tickets /: id
POST / tickets
PUT / tickets /: id

GET / settings
PUT / settings

คำตอบ:


8

HATEOAS :

GET /partners/:partner_id/tickets - รายการตั๋วของพันธมิตรนั่นคือส่งคืนรายการ URIs ซึ่งอาจเป็นของแบบฟอร์ม /tickets/:id

GET /partners/:partner_id/tickets/:id - ไม่ต้องการ

POST /partners/:partner_id/tickets - สร้างตั๋วและผู้ร่วมงานให้กับพันธมิตรส่งคืน 201 ด้วย URI ใหม่ของแบบฟอร์ม /tickets/:id


2
ตอนนี้ฉันเข้าใจมากขึ้น ขอบคุณมาก :) แต่สิ่งที่เกี่ยวกับประสิทธิภาพ? สมมติว่าสถานการณ์นั้น: คุณต้องการสร้างรายการตั๋วที่มีข้อมูลสั้น ๆ คุณต้องขอรายชื่อตั๋วสำหรับคู่ค้าและหลังจากนั้นขอให้แต่ละตั๋วเป็นรายบุคคล ฉันถูกไหม?
Przemek

ก็ใช่ หรือคุณอาจทำให้/partners/:partner_id/ticketsรายการนั้นมีข้อมูลที่เป็นประโยชน์สำหรับแต่ละตั๋วไม่ใช่เฉพาะ URI ตามบัญญัติของตั๋ว ตัวอย่างเช่นใน JSON อาจเป็นไปได้[{href='/tickets/12',value=10,due='2013-08-13'},{href='/tickets/18',value=7,due='2013-09-02'}]ดังนั้นลูกค้าสามารถแสดงตารางได้ทันทีและรับทรัพยากรตั๋วเต็มสำหรับการจัดการเพิ่มเติม
Javier

ตกลงมันชัดเจน
Przemek

BTW สำหรับ / partners /: partner_id / tickets ควรมีการจัดเตรียมเอกสารไว้ในส่วนแหล่งข้อมูลพันธมิตรหรือตั๋วหรือไม่
Przemek

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