@ray การสนทนาที่ยอดเยี่ยม
@ jgerman อย่าลืมว่าเพียงเพราะ REST ไม่ได้หมายความว่าจะต้องใช้ทรัพยากรจาก POST
สิ่งที่คุณเลือกที่จะรวมไว้ในการนำเสนอทรัพยากรใด ๆ นั้นขึ้นอยู่กับคุณ
กรณีของคุณในการอ้างอิงที่แยกต่างหากเป็นเพียงการสร้างแหล่งข้อมูลผู้ปกครอง (หนังสือการ์ตูน) ที่มีทรัพยากรเด็ก (ปก) ที่อาจจะอ้างอิงข้าม ตัวอย่างเช่นคุณอาจต้องการให้การอ้างอิงกับผู้แต่งผู้เผยแพร่ตัวละครหรือหมวดหมู่แยกจากกัน คุณอาจต้องการสร้างแหล่งข้อมูลเหล่านี้แยกต่างหากหรือก่อนหน้าหนังสือการ์ตูนที่อ้างอิงพวกเขาเป็นแหล่งข้อมูลย่อย หรือคุณอาจต้องการสร้างทรัพยากรลูกใหม่เมื่อสร้างทรัพยากรหลัก
กรณีเฉพาะของคุณนั้นมีความซับซ้อนมากขึ้นเล็กน้อยซึ่งปกหนังสือนั้นต้องการหนังสือการ์ตูนจริง ๆ และวีซ่ากลับกัน
อย่างไรก็ตามหากคุณพิจารณาข้อความอีเมลเป็นแหล่งข้อมูลและที่อยู่จากเป็นทรัพยากรย่อยคุณจะยังคงสามารถอ้างอิงจากที่อยู่แยกต่างหากได้ ตัวอย่างเช่นรับทั้งหมดจากที่อยู่ หรือสร้างข้อความใหม่ด้วยที่อยู่ก่อนหน้าจากที่อยู่ หากอีเมลเป็น REST คุณจะเห็นได้อย่างง่ายดายว่าทรัพยากรที่มีการอ้างอิงโยงหลายตัวสามารถใช้งานได้ / / ได้รับข้อความ, / ข้อความร่าง, / จากที่อยู่ / ถึงที่อยู่ / ที่อยู่ / อาสาสมัคร / สิ่งที่แนบมา / โฟลเดอร์ , / tags, / categories, / label, et al.
บทช่วยสอนนี้แสดงตัวอย่างที่ดีของแหล่งข้อมูลอ้างอิงข้าม
http://www.peej.co.uk/articles/restfully-delicious.html
นี่เป็นรูปแบบทั่วไปสำหรับข้อมูลที่สร้างขึ้นโดยอัตโนมัติ ตัวอย่างเช่นคุณไม่ได้โพสต์ URI, ID หรือวันที่สร้างสำหรับทรัพยากรใหม่เนื่องจากสิ่งเหล่านี้สร้างขึ้นโดยเซิร์ฟเวอร์ และคุณยังสามารถดึงข้อมูล URI, ID หรือวันที่สร้างเมื่อคุณได้รับทรัพยากรใหม่กลับมา
ตัวอย่างในกรณีของข้อมูลไบนารี ตัวอย่างเช่นคุณต้องการโพสต์ข้อมูลไบนารีเป็นทรัพยากรย่อย เมื่อคุณรับรีซอร์สพาเรนต์คุณสามารถแสดงรีซอร์สชายน์เหล่านั้นเป็นข้อมูลไบนารีเดียวกันหรือเป็น URIs ซึ่งแสดงข้อมูลไบนารี
แบบฟอร์ม & พารามิเตอร์แตกต่างจากการเป็นตัวแทนของทรัพยากร HTML แล้ว การโพสต์พารามิเตอร์ไบนารี / ไฟล์ซึ่งทำให้ URL ไม่ยืด
เมื่อคุณได้รับแบบฟอร์มสำหรับทรัพยากรใหม่ (/ comic-books / new) หรือรับแบบฟอร์มเพื่อแก้ไขทรัพยากร (/ comic-books / 0 / แก้ไข) คุณกำลังขอการแทนเฉพาะของแบบฟอร์มของทรัพยากร หากคุณโพสต์ลงในคอลเล็กชันทรัพยากรด้วยแอปพลิเคชัน / x-www-form-urlencoded "เนื้อหา" หรือ "multipart / form-data" คุณจะขอให้เซิร์ฟเวอร์บันทึกการแสดงประเภทนั้น เซิร์ฟเวอร์สามารถตอบสนองด้วยการเป็นตัวแทน HTML ซึ่งถูกบันทึกไว้หรืออะไรก็ตาม
คุณอาจต้องการอนุญาตให้มีการโพสต์ HTML, XML หรือ JSON ลงในการรวบรวมทรัพยากรเพื่อวัตถุประสงค์ของ API หรือคล้ายกัน
นอกจากนี้ยังเป็นไปได้ที่จะเป็นตัวแทนของทรัพยากรและเวิร์กโฟลว์ของคุณตามที่คุณอธิบายโดยคำนึงถึงการโพสต์ครอบคลุมหลังจากหนังสือการ์ตูน ตัวอย่างดังนี้
- อนุญาตการสร้างหน้าปกล่าช้า
- อนุญาตให้สร้างหนังสือการ์ตูนพร้อมปกที่จำเป็น
- ช่วยให้ครอบคลุมที่จะอ้างอิงข้าม
- ช่วยให้ครอบคลุมหลาย
- สร้างหนังสือการ์ตูนร่าง
- สร้างปกหนังสือการ์ตูนร่าง
- เผยแพร่หนังสือการ์ตูนร่าง
GET / comic-books
=> 200 ตกลง, รับหนังสือการ์ตูนทั้งหมด
GET / หนังสือการ์ตูน / 0
=> 200 ตกลง, รับหนังสือการ์ตูน (id: 0) พร้อมหน้าปก (/ หน้าปก / 1, / หน้าปก / 2)
GET / หนังสือการ์ตูน / 0 / หน้าปก
=> 200 ตกลง, รับความคุ้มครองสำหรับหนังสือการ์ตูน (id: 0)
GET / covers
=> 200 ตกลงรับความคุ้มครองทั้งหมด
GET / covers / 1
=> 200 ตกลง, รับ cover (id: 1) พร้อมหนังสือการ์ตูน (/ comic-books / 0)
GET / หนังสือการ์ตูน / ใหม่
=> 200 ตกลง, รับแบบฟอร์มเพื่อสร้างหนังสือการ์ตูน (แบบฟอร์ม: POST / ฉบับร่างหนังสือการ์ตูน)
POST / ฉบับร่างหนังสือการ์ตูน
=
ผู้แต่งfoo =
ผู้จัดพิมพ์boo = goo
เผยแพร่ = 2011-01-01
=> 302 พบ, ที่ตั้ง: / ฉบับร่างหนังสือการ์ตูน / 3, เปลี่ยนเส้นทางไปยังหนังสือการ์ตูนฉบับร่าง (id: 3) ด้วย ครอบคลุม (ไบนารี)
GET / draft-comic-books / 3
=> 200 ตกลง, รับร่างหนังสือการ์ตูน (id: 3) พร้อมปก
GET / ฉบับร่างหนังสือ / 3 / หน้าปก
=> 200 ตกลงรับความคุ้มครองสำหรับหนังสือการ์ตูนฉบับร่าง (/ ฉบับร่างหนังสือการ์ตูน / 3)
GET / ร่างหนังสือการ์ตูน / 3 / หน้าปก / ใหม่
=> 200 ตกลง, รับแบบฟอร์มเพื่อสร้างหน้าปกสำหรับหนังสือการ์ตูนฉบับร่าง (/ ฉบับร่างหนังสือการ์ตูน / 3) (แบบฟอร์ม: POST / ร่างหนังสือการ์ตูน / 3 / ปก).
POST / draft-comic-books / 3 / cover
cover_type = front
cover_data = (ไบนารี)
=> 302 พบ, ที่อยู่: / ฉบับร่าง / หนังสือการ์ตูน / 3 / ปก, เปลี่ยนเส้นทางไปยังหน้าปกใหม่สำหรับหนังสือการ์ตูนร่าง (/ ร่างการ์ตูน -book / 3 / ปก / 1)
GET / ร่างหนังสือการ์ตูน / 3 / เผยแพร่
=> 200 ตกลง, รับแบบฟอร์มเพื่อเผยแพร่หนังสือการ์ตูนฉบับร่าง (id: 3) (แบบฟอร์ม: POST / หนังสือการ์ตูนที่ตีพิมพ์)
POST / หนังสือการ์ตูนที่ตีพิมพ์
=
ผู้แต่งfoo =
ผู้เผยแพร่boo = ผู้เผยแพร่ goo
= 2011-01-01
cover_type = cover_data ด้านหน้า
= (ไบนารี)
=> 302 พบ, ที่อยู่: / หนังสือการ์ตูน / 3, เปลี่ยนเส้นทางไปเป็นหนังสือการ์ตูนที่ตีพิมพ์ (id: 3) พร้อมผ้าคลุม