ฉันสนใจที่จะเปิดเผยอินเทอร์เฟซ REST โดยตรงกับคอลเล็กชันของเอกสาร JSON (คิดว่าCouchDBหรือPersevere ) ปัญหาที่ฉันพบคือวิธีจัดการการGET
ดำเนินการบนคอลเลกชันรูทหากคอลเลกชันมีขนาดใหญ่
ตัวอย่างเช่นแกล้งทำเป็นว่าฉันกำลังเปิดเผยQuestions
ตารางของ StackOverflow ซึ่งแต่ละแถวจะแสดงเป็นเอกสาร (ไม่ใช่ว่าจำเป็นต้องมีตารางดังกล่าวเป็นเพียงตัวอย่างที่เป็นรูปธรรมของชุด 'เอกสาร' ที่มีขนาดใหญ่) คอลเลกชันจะทำให้สามารถดูได้ที่/db/questions
กับ API CRUD ปกติGET /db/questions/XXX
, PUT /db/questions/XXX
, POST /db/questions
อยู่ในการเล่น วิธีมาตรฐานในการรับคอลเลกชันทั้งหมดคือGET /db/questions
แต่ถ้าการทิ้งแต่ละแถวเป็นออบเจ็กต์ JSON อย่างไร้เดียงสาคุณจะได้รับการดาวน์โหลดที่ค่อนข้างใหญ่และทำงานได้มากในส่วนของเซิร์ฟเวอร์
วิธีแก้ปัญหาคือการเพจ Dojo มีการแก้ไขปัญหานี้ในของJsonRestStoreผ่านทางส่วนขยาย RFC2616 สอดคล้องฉลาดของใช้ส่วนหัวกับหน่วยช่วงที่กำหนดเองRange
items
ผลลัพธ์คือ a 206 Partial Content
ที่ส่งคืนเฉพาะช่วงที่ร้องขอ ข้อได้เปรียบของวิธีนี้เหนือพารามิเตอร์การค้นหาคือมันจะทิ้งสตริงการสืบค้นไว้สำหรับ ... คิวรี (เช่นGET /db/questions/?score>200
หรือบางครั้งและใช่ว่าจะเข้ารหัส%3E
)
แนวทางนี้ครอบคลุมพฤติกรรมที่ฉันต้องการอย่างสมบูรณ์ ปัญหาคือRFC 2616ระบุว่าในการตอบสนอง 206 (เน้นของฉัน):
คำขอต้องมีรวมถึงข้อมูลส่วนหัวช่วง ( ส่วน 14.35 ) แสดงให้เห็นช่วงที่ต้องการและอาจจะรวมถึงข้อมูลส่วนหัวถ้าช่วง ( ส่วน 14.27 ) เพื่อให้เงื่อนไขการร้องขอ
สิ่งนี้สมเหตุสมผลในบริบทของการใช้ส่วนหัวมาตรฐาน แต่เป็นปัญหาเพราะฉันต้องการให้คำตอบ 206 เป็นค่าเริ่มต้นในการจัดการกับลูกค้าที่ไร้เดียงสา / คนที่สุ่มสำรวจ
ฉันได้ดูรายละเอียดเกี่ยวกับ RFC เพื่อหาวิธีแก้ปัญหา แต่ไม่พอใจกับวิธีแก้ปัญหาของฉันและสนใจที่ SO จะจัดการกับปัญหา
ความคิดที่ฉันมี:
- กลับมา
200
พร้อมContent-Range
ส่วนหัว! - ฉันไม่คิดว่าสิ่งนี้ผิด แต่ฉันต้องการถ้าตัวบ่งชี้ที่ชัดเจนกว่านี้ว่าการตอบสนองเป็นเพียงเนื้อหาบางส่วน - Return
400 Range Required
- ไม่มีรหัสตอบกลับพิเศษ 400 สำหรับส่วนหัวที่ต้องการดังนั้นจึงต้องใช้ข้อผิดพลาดเริ่มต้นและอ่านด้วยมือ นอกจากนี้ยังทำให้การสำรวจผ่านเว็บเบราว์เซอร์ (หรือไคลเอนต์อื่น ๆ เช่น Resty) ยากขึ้น - ใช้พารามิเตอร์การค้นหา - วิธีการมาตรฐาน แต่ฉันหวังว่าจะอนุญาตการสืบค้น a la Persevere และสิ่งนี้จะตัดลงในเนมสเปซการสืบค้น
- แค่กลับ
206
! - ฉันคิดว่าลูกค้าส่วนใหญ่จะไม่ประหลาดใจ แต่ฉันไม่อยากต่อต้าน MUST ใน RFC - ขยายสเป็ค! Return
266 Partial Content
- มีพฤติกรรมเหมือน 206 แต่ตอบสนองต่อคำร้องขอที่ต้องไม่มีRange
ส่วนหัว ฉันคิดว่า 266 นั้นสูงพอที่ฉันไม่ควรเจอปัญหาการชนกันและมันก็สมเหตุสมผลสำหรับฉัน แต่ฉันไม่ชัดเจนว่านี่ถือเป็นข้อห้ามหรือไม่
ฉันคิดว่านี่เป็นปัญหาที่พบได้บ่อยและฉันอยากเห็นสิ่งนี้เกิดขึ้นในแบบพฤตินัยดังนั้นฉันหรือคนอื่นจะไม่คิดค้นล้อใหม่
วิธีใดที่ดีที่สุดในการแสดงคอลเล็กชันทั้งหมดผ่าน HTTP เมื่อคอลเล็กชันมีขนาดใหญ่