การสร้างความสัมพันธ์เอนทิตีใน REST: ฉันสามารถสร้างพาเรนต์โดยโพสต์ไปที่ id เด็กได้หรือไม่?


9

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

URI ของเราจะเป็นดังนี้:

/users/{id}/assets/{id}/services/{id}

การใช้ API จะทราบรหัสเนื้อหาและรหัสบริการเพื่อสร้างรายการใหม่ สิ่งที่เราดิ้นรนคือการสร้างความสัมพันธ์นี้

วิธีหนึ่งที่ตรงไปตรงมาคือการโพสต์ความสัมพันธ์ทั้งหมด /users/{id}/assets/

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

แต่จากนั้นเราไม่ได้สร้างเนื้อหาตามที่ URI อาจระบุ แต่เป็นเรื่องเกี่ยวกับบริการสินทรัพย์

อีกทางเลือกหนึ่งเรากำลังพิจารณา POST'ing กับ URI ที่เกี่ยวข้องกับความสัมพันธ์ดังนี้:

POST /users/{id}/assets/{id}/service/{id}
{attribute1:"{var}", attribute2:"{var}"}

แต่ในกรณีนี้เส้นทางของทรัพยากร/users/{id}/assets/{id}จะไม่มีอยู่ก่อน POST และจะถูกสร้างเป็นผลข้างเคียง

กำลังโพสต์ไปยังเส้นทางของทรัพยากรที่ยังไม่ได้รับอนุญาตเลย?

ขอบคุณสำหรับความคิดของคุณ

เจอราร์ด

คำตอบ:


3

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

หากคุณถามว่ารูปแบบการสร้างต่อการเข้าถึงนี้เป็นรูปแบบการพัฒนาที่ถูกต้องและเป็นที่ยอมรับหรือไม่คำตอบคือใช่มันเป็น - เป็นทั้งที่ถูกต้องและเป็นรูปแบบที่พบได้ทั่วไป


1
ขอบคุณสำหรับคำตอบ. พอยน์เตอร์ใด ๆ สำหรับการอ้างอิงบางอย่างที่ฉันสามารถปรึกษาได้?
maasg

2

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

ประการที่สอง: JSON ของคุณไม่ถูกต้องคุณต้องจัดการกับบริการเป็นวัตถุอื่นภายในวัตถุสินทรัพย์เช่นเดียวกับในบริการ "U" ของทรัพยากร URI ที่คุณต้องจัดการเป็นอาร์เรย์

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

จะต้องมี:

POST /users/{id}/assets    
{services:[{ attribute1:"var", attribute2:"var"}]}

หากคุณจะใช้วิธีนี้

ที่สาม: ฉันไม่ชอบที่จะใช้วิธีนี้ในการเสนอการออกแบบหากกรณีนี้ล้มเหลวคุณจะรู้ได้อย่างไรว่ามันล้มเหลวขณะสร้างสินทรัพย์หรือบริการ


0

นี่คือแนวความคิดที่แตกต่าง:

POST /relationships
{ relationship:${id}, asset:{id}, service:{id}, user:{id}, data:"some data" }

วิธีนี้คุณจะกำหนดความสัมพันธ์เป็นลิงก์สามทางระหว่างเนื้อหาบริการและผู้ใช้และไม่แสดงถึงความสัมพันธ์แบบลำดับชั้นใด ๆ

จากนั้นคุณสามารถดึงความสัมพันธ์เฉพาะโดย:

GET /relationships?id="2144321"

หรือค้นหาส่วนย่อยของความสัมพันธ์โดย:

GET /relationships?user="43434"

หรือ

GET /relationships?asset="12433"

วิธีดั้งเดิมไม่ผิด แต่วิธีการนี้อาจให้ความยืดหยุ่นกับผู้ใช้มากขึ้น

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