แนวคิดหลายอย่างที่เกี่ยวข้องกับความขัดแย้ง REST ในหัวของฉันเมื่อฉันลองใช้มัน
ฉันมี REST-ful back-end API ระบบที่เก็บตรรกะทางธุรกิจและเว็บแอปพลิเคชันที่มี UI จากแหล่งข้อมูลต่างๆเกี่ยวกับ REST (โดยเฉพาะอย่างยิ่งส่วนที่เหลือในการปฏิบัติ: Hypermedia และระบบสถาปัตยกรรม ) ฉันรู้ว่าฉันไม่ควรเปิดเผยตัวระบุดิบของหน่วยงานของฉัน rel="self"
แต่กลับเชื่อมโยงหลายมิติด้วย
พิจารณาตัวอย่าง REST api มีทรัพยากรที่ส่งคืนบุคคล:
<Person>
<Links>
<Link rel="self" href="http://my.rest.api/api/person/1234"/>
</Links>
<Pets>
<Link rel="pet" href="http://my.rest.api/api/pet/678"/>
</Pets>
</Person>
ปัญหาเกิดขึ้นกับเว็บแอปพลิเคชัน สมมติว่ามันส่งคืนหน้าเว็บที่มีไฮเปอร์ลิงก์ไปยังเบราว์เซอร์:
<body class="person">
<p>
<a href="http://my.web.app/pet/???????" />
</p>
</body>
ฉันควรใส่href
คุณลักษณะอะไร ฉันจะเก็บ URL เอนทิตี API ไว้ในเว็บแอปพลิเคชันเพื่อให้สามารถรับเอนทิตีได้เมื่อผู้ใช้เปิดหน้าเป้าหมายได้อย่างไร
ข้อกำหนดดูเหมือนขัดแย้งกัน:
- การเชื่อมโยงหลายมิติ
href
ควรนำไปสู่เว็บแอปพลิเคชันเนื่องจากเป็นระบบที่โฮสต์ UI - The
href
ควรมี id ของเอนทิตีเนื่องจากเว็บแอปต้องสามารถระบุเอนทิตีเมื่อหน้าเป้าหมายเปิดขึ้น - เว็บแอปไม่ควรแยก / สร้าง REST URL เพราะไม่ใช่ REST-ful หนังสือดังกล่าวกล่าว
URIs ควรทึบแสงต่อผู้บริโภค มีเพียงผู้ออก URI เท่านั้นที่รู้วิธีตีความและแมปกับทรัพยากร
ดังนั้นฉันจึงไม่สามารถใช้เวลาเพียงแค่1234
จาก URL ตอบสนอง API http://my.rest.api/api/AGRIDd~ryPQZ^$RjEL0j
เพราะเป็นลูกค้าสงบฉันควรจะรักษามันราวกับว่ามันเป็นสิ่งที่ชอบ ในทางกลับกันฉันต้องให้ URL ที่นำไปสู่เว็บแอปของฉันและเพียงพอสำหรับแอปที่จะคืนค่า URL ดั้งเดิมของ API และใช้ URL นั้นเพื่อเข้าถึงทรัพยากร API
วิธีที่ง่ายที่สุดอาจเป็นเพียงการใช้ URL ของทรัพยากร API เป็นตัวระบุสตริง แต่ URL ของหน้าเว็บhttp://my.web.app/person/http%3A%2F%2Fmy.rest.api%2Fapi%2Fperson%2F1234
นั้นน่าเกลียด
ทุกอย่างดูเหมือนจะง่ายสำหรับแอปเดสก์ท็อปหรือแอพพลิเคชั่นจาวาสคริปต์หน้าเดียว เนื่องจากพวกมันอาศัยอยู่อย่างต่อเนื่องพวกเขาสามารถเก็บ URL ไว้ในหน่วยความจำร่วมกับวัตถุบริการสำหรับอายุการใช้งานของแอปพลิเคชันและใช้เมื่อจำเป็น
ด้วยแอปพลิเคชันเว็บฉันสามารถจินตนาการได้หลายวิธี แต่ทุกอย่างดูแปลก:
- แทนที่โฮสต์ใน API URL และเก็บผลลัพธ์ไว้เท่านั้น ข้อเสียใหญ่คือมันต้องใช้เว็บแอปพลิเคชันเพื่อจัดการกับสิ่งที่ URL ที่ API สร้างขึ้นซึ่งหมายถึงการมีเพศสัมพันธ์ที่ชั่วร้าย ยิ่งไปกว่านั้นมันไม่สงบอีกต่อไปเพราะเว็บแอปของฉันเริ่มตีความ URL
- เปิดเผยรหัสดิบใน REST API พร้อมกับลิงก์ใช้เพื่อสร้าง URL ของ Web App จากนั้นใช้รหัสบนเซิร์ฟเวอร์เว็บแอปเพื่อค้นหาทรัพยากรที่จำเป็นใน API สิ่งนี้ดีกว่า แต่จะส่งผลต่อประสิทธิภาพการทำงานของเซิร์ฟเวอร์เว็บแอปเนื่องจากเว็บแอปจะต้องผ่านการนำทางบริการ REST ที่ออกคำขอลูกโซ่แบบขอเป็นรายบุคคลเพื่อจัดการกับคำขอใด ๆ จากเบราว์เซอร์ สำหรับทรัพยากรที่ค่อนข้างซ้อนกันอาจมีค่าใช้จ่ายสูง
- เก็บ
self
URL ทั้งหมดที่ส่งคืนโดย api ในการจับคู่แบบถาวร (DB?) บนเว็บแอปเซิร์ฟเวอร์ สร้างรหัสบางส่วนสำหรับพวกเขาใช้รหัสเพื่อสร้าง URL หน้าเว็บแอปและเพื่อรับ URL ของทรัพยากรบริการ REST คือผมเก็บhttp://my.rest.api/pet/678
ที่ไหนสักแห่ง URL กับคีย์ใหม่การพูด3
และการสร้าง URLhttp://my.web.app/pet/3
ของหน้าเว็บ ดูเหมือนว่าการนำ HTTP Cache ไปใช้ในบางประเภท ฉันไม่รู้ว่าทำไม แต่ดูเหมือนแปลกสำหรับฉัน
หรือทุกอย่างหมายความว่า RESTful API ไม่สามารถใช้เป็นแบ็กเอนด์สำหรับแอปพลิเคชันเว็บได้หรือไม่