การแบ่งหน้าในเว็บแอ็พพลิเคชัน REST


329

นี่คือการปฎิรูปทั่วไปของคำถามนี้ (ด้วยการกำจัดส่วนเฉพาะของ Rails)

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

1. ใช้สตริงข้อความค้นหาเท่านั้น

เช่น. http://application/products?page=2&sort_by=date&sort_how=asc
ปัญหาที่นี่คือฉันไม่สามารถใช้การแคชแบบเต็มหน้าและ URL ไม่สะอาดและง่ายต่อการจดจำ

2. การใช้หน้าเป็นทรัพยากรและสตริงแบบสอบถามสำหรับการเรียงลำดับ

เช่น. http://application/products/page/2?sort_by=date&sort_how=asc
ในกรณีนี้ปัญหาที่เห็นคือhttp://application/products/pages/1ไม่ได้เป็นทรัพยากรที่ไม่ซ้ำกันเนื่องจากการใช้sort_by=priceสามารถให้ผลลัพธ์ที่แตกต่างกันโดยสิ้นเชิงและฉันยังไม่สามารถใช้การแคชหน้า

3. การใช้หน้าเป็นทรัพยากรและส่วน URL สำหรับการเรียงลำดับ

เช่น. http://application/products/by-date/page/2
ฉันเองเห็นว่าไม่มีปัญหาในการใช้วิธีนี้ แต่มีคนเตือนฉันว่านี่ไม่ใช่วิธีที่ดีที่จะไป (เขาไม่ได้ให้เหตุผลดังนั้นถ้าคุณรู้ว่าทำไมมันถึงไม่แนะนำกรุณาแจ้งให้เราทราบ)

ใด ๆข้อเสนอแนะความคิดเห็นวิพากษ์วิจารณ์มากกว่าการต้อนรับ ขอบคุณ


34
นี่เป็นคำถามที่ยอดเยี่ยม
ผู้ถือเลน

7
คำถามโบนัส: คนทั่วไปจะระบุขนาดหน้าได้อย่างไร
Heiko Rupp

อย่าลืมเกี่ยวกับพารามิเตอร์เมทริกซ์w3.org/DesignIssues/MatrixURIs.html
CMCDragonkai

คำตอบ:


66

ฉันคิดว่าปัญหาของเวอร์ชัน 3 เป็นปัญหา "มุมมอง" มากกว่านี้ - คุณเห็นหน้าเว็บเป็นทรัพยากรหรือผลิตภัณฑ์ในหน้า

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

แต่ถ้าคุณเห็นผลิตภัณฑ์ในหน้าเป็นทรัพยากรคุณมีปัญหาว่าผลิตภัณฑ์ในหน้า 2 อาจเปลี่ยนแปลง (ลบผลิตภัณฑ์เก่าหรืออะไรก็ตาม) ในกรณีนี้ URI จะไม่ส่งคืนทรัพยากรเดียวกันเสมอ

เช่นลูกค้าจัดเก็บลิงค์ไปยังหน้ารายการผลิตภัณฑ์ X ในครั้งถัดไปที่เปิดลิงค์ผลิตภัณฑ์ที่สงสัยอาจจะไม่อยู่ในหน้า X อีกต่อไป


6
ดี แต่ถ้าคุณลบบางสิ่งไม่ควรมีอย่างอื่นใน URI เดียวกัน หากคุณลบผลิตภัณฑ์ทั้งหมดของหน้า X - หน้า X อาจยังคงใช้ได้ แต่มีผลิตภัณฑ์ในขณะนี้จากหน้า X + 1 ดังนั้น URI สำหรับหน้า X จึงกลายเป็น URI สำหรับหน้า X + 1 หากคุณเห็นในมุมมองทรัพยากรผลิตภัณฑ์ "
Fionn

1
> หากคุณเห็นว่าหน้าเป็นทรัพยากรมันเป็นทางออกที่ดีอย่างสมบูรณ์เนื่องจากการค้นหาหน้า 2 จะทำให้ได้ผลลัพธ์ที่หน้า 2 มันสมเหตุสมผลหรือไม่ URL เดียวกัน (URL ใด ๆ ที่กล่าวถึงหน้า 2) จะให้ผลหน้า 2 เสมอไม่ว่าคุณจะเป็นทรัพยากรอะไร
temoto

2
การดูหน้าเว็บเป็นทรัพยากรน่าจะแนะนำ POST / foo / page เพื่อสร้างหน้าใหม่ใช่ไหม
temoto

18
คำตอบของคุณไปที่ "การแก้ปัญหาที่ถูกต้องคือ 1" อย่างราบรื่น แต่ไม่ได้ระบุไว้
temoto

2
ในใจของฉันหน้าเป็นแนวคิดลอยและไม่เกี่ยวข้องกับโดเมนพื้นฐาน ดังนั้นจึงไม่ควรถือว่าเป็นทรัพยากร ฉันหมายถึงการลอยอยู่ในความรู้สึกว่ามันลื่นไหลแนวคิดของการเปลี่ยนแปลงหน้าเว็บกับบริบท ผู้ใช้หนึ่งรายของ API ของคุณอาจเป็นแอพมือถือที่สามารถใช้งานได้เพียง 2 ผลิตภัณฑ์ต่อหน้าในขณะที่ผู้ใช้รายอื่นเป็นแอปเครื่องที่สามารถใช้รายการแช่งทั้งหมด ในระยะสั้นหน้าคือ "การแสดง" ของเอนทิตีโดเมนพื้นฐาน (ผลิตภัณฑ์) และไม่ควรรวมเป็นส่วนหนึ่งของ URL เป็นพารามิเตอร์เคียวรีเท่านั้น
Kingz

106

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


28
+1: สตริงการสืบค้นไม่ใช่ตัวระบุทรัพยากรชั้นหนึ่ง พวกเขาเพียงชี้แจงสำหรับการสั่งซื้อและการจัดกลุ่มของทรัพยากร
S.Lott

1
@ S.Lott คำขอเป็นทรัพยากร สิ่งที่คุณเรียกว่า "ทรัพยากรชั้นแรก" จะถูกกำหนดเป็นค่าโดยฟีลดิงในส่วน 5.2.1.1 ของวิทยานิพนธ์ของเขา นอกจากนี้ในส่วนเดียวกัน Fielding ให้การแก้ไขล่าสุดของซอร์สโค้ดไฟล์เป็นตัวอย่างของทรัพยากร จะเป็นทรัพยากรได้อย่างไร แต่ผลิตภัณฑ์ 10 รายการล่าสุดเป็น "คุณสมบัติของคำขอทรัพยากรผลิตภัณฑ์" ฉันเข้าใจว่ามุมมองของคุณมีประโยชน์มากกว่า แต่ฉันคิดว่ามันเงียบสงบกว่า
edsioufi

โปรดทราบว่าความคิดเห็นของฉันไม่ได้หมายความว่าฉันไม่เห็นด้วยกับการเลือกใช้สตริงการสืบค้นผ่าน URL: ทั้งคู่เป็นโซลูชันที่ทำงานได้ตราบใดที่ API นั้นใช้สื่อหลายมิติเช่น @RichApodaca ได้กล่าวถึงคำตอบของเขาแล้ว ฉันแค่ชี้ให้เห็นว่าหน้าควรได้รับการพิจารณาว่าเป็นทรัพยากรจากมุมมอง REST
edsioufi

37

HTTP มีส่วนหัว Range ที่ยอดเยี่ยมซึ่งเหมาะสำหรับการแบ่งหน้าด้วย คุณสามารถส่ง

Range: pages=1

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

Range: products-by-date=2009_03_27-

เพื่อรับผลิตภัณฑ์ใหม่ทั้งหมดกว่าวันที่หรือ

Range: products-by-date=0-2009_11_30

เพื่อรับผลิตภัณฑ์ทั้งหมดที่เก่ากว่าวันที่นั้น '0' อาจไม่ใช่วิธีที่ดีที่สุด แต่ RFC ดูเหมือนจะต้องการบางสิ่งบางอย่างสำหรับช่วงเริ่มต้น อาจมีการใช้ตัวแยกวิเคราะห์ HTTP ซึ่งจะไม่แยกวิเคราะห์หน่วย = -range_end

หากส่วนหัวไม่ใช่ตัวเลือก (ยอมรับได้) ฉันคิดวิธีแก้ปัญหาแรก (ทั้งหมดในสตริงข้อความค้นหา) เป็นวิธีจัดการกับหน้าเว็บ แต่โปรดทำให้คำสั่งสตริงการค้นหา (เรียงลำดับ (คีย์ = ค่า) เป็นปกติตามลำดับตัวอักษร) วิธีนี้จะช่วยแก้ปัญหาความแตกต่างของ "? a = 1 & b = x" และ "? b = x & a = 1"


34
ส่วนหัวอาจดูดีตั้งแต่แรกเห็น แต่ไม่อนุญาตให้แบ่งปันหน้าเว็บ (เช่นคัดลอก URL) ดังนั้นสำหรับคำขอ ajax พวกเขาอาจเป็นทางออกที่ดี (เนื่องจากหน้าที่แก้ไขโดย ajax ไม่สามารถแชร์ในสถานะปัจจุบันของพวกเขาได้) แต่ฉันจะไม่ใช้พวกเขาสำหรับการแบ่งหน้าตามปกติ
Markus

3
และส่วนหัว Range นั้นใช้สำหรับช่วงไบต์เท่านั้น ดู [ข้อมูลจำเพาะส่วนหัว HTTP] ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ), ส่วน 14.35
Chris Westin

16
@ChrisWestin w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.12 HTTP / 1.1 ใช้หน่วยช่วงในฟิลด์ส่วนหัว (ส่วน 14.35) และช่วงเนื้อหา (มาตรา 14.16) range-unit = bytes-unit | other-range-unit บางทีคุณกำลังอ้างถึงThe only range unit defined by HTTP/1.1 is "bytes". HTTP/1.1 implementations MAY ignore ranges specified using other units.นั่นไม่เหมือนกับคำสั่งของคุณ
temoto

1
@Markus ฉันไม่สามารถจินตนาการกรณีที่ใช้เมื่อคุณใช้ทรัพยากรร่วมกันส่วนที่เหลือ API :)
JakubKnejzlik

@JakubKnejzlik Sharing ไม่ใช่ปัญหา แต่การใช้ส่วนหัว HTTP สำหรับการเพจป้องกันการใช้ลิงค์ HATEOAS สำหรับการเพจ
xarx

25

ตัวเลือกที่ 1 นั้นดูดีที่สุดเท่าที่แอปพลิเคชันของคุณมองว่าการแบ่งหน้าเป็นเทคนิคในการสร้างมุมมองที่แตกต่างกันของทรัพยากรเดียวกัน

ต้องบอกว่ารูปแบบ URL ค่อนข้างไม่มีนัยสำคัญ หากคุณกำลังออกแบบแอปพลิเคชันของคุณให้เป็นไฮเปอร์เท็กซ์ขับเคลื่อน (เนื่องจากแอปพลิเคชัน REST ทั้งหมดต้องเป็นไปตามคำจำกัดความ) ไคลเอ็นต์ของคุณจะไม่สร้าง URIs ใด ๆ ด้วยตัวเอง แอปพลิเคชันของคุณจะให้ลิงก์ไปยังลูกค้าแทนและลูกค้าจะติดตามพวกเขา

ลิงค์ประเภทหนึ่งที่ลูกค้าของคุณสามารถให้ได้คือลิงค์สำหรับการแบ่งหน้า

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


3
การแจ้งเตือนที่ดีเกี่ยวกับการใช้สื่อสิ่งพิมพ์เช่นลิงก์ในบริการเว็บ REST
Paul D. Eden

11

ฉันมักจะใช้รูปแบบของตัวเลือกที่ 1 เสมอแคชไม่ได้เป็นเรื่องที่กังวลเนื่องจากข้อมูลมีการเปลี่ยนแปลงบ่อยในกรณีของฉัน หากคุณอนุญาตให้ปรับขนาดหน้าได้อีกครั้งข้อมูลจะไม่ถูกแคช

ฉันไม่พบ URL ที่จำยากหรือสกปรก สำหรับฉันนี่คือการใช้พารามิเตอร์การสืบค้นที่ดี ทรัพยากรเป็นรายการผลิตภัณฑ์อย่างชัดเจนและพารามิเตอร์การสืบค้นกำลังบอกวิธีที่คุณต้องการแสดงรายการ - เรียงลำดับและหน้าใด


1
+1 ฉันคิดว่าคุณพูดถูกและฉันจะไปกับพารามิเตอร์การสืบค้น (ตัวเลือก 1)
andi

"ฉันไม่พบ URL ที่จำได้ยาก" การสังเกตนี้ไม่มีประโยชน์ในแอปพลิเคชัน REST เนื่องจากโดยทั่วไปแล้วควรมีบุ๊คมาร์คเดียวเท่านั้น ... หากผู้ใช้ (หรือแอปไคลเอ็นต์) พยายามที่จะ "จำ" URL นี่เป็นสัญญาณที่ดีที่ API ไม่ได้พักผ่อน
edsioufi

8

แปลกที่ไม่มีใครชี้ให้เห็นว่าตัวเลือก 3 มีพารามิเตอร์ตามลำดับเฉพาะ http // แอปพลิเคชัน / ผลิตภัณฑ์ / วันที่ / มากไปน้อย / ชื่อ / จากน้อยไปมาก / หน้า / 2 และ http // แอปพลิเคชัน / ผลิตภัณฑ์ / ชื่อ / จากน้อยไปมาก / วันที่ / มากไปน้อย / หน้า / 2

กำลังชี้ไปที่ทรัพยากรเดียวกัน แต่มี URL ที่แตกต่างอย่างสิ้นเชิง

สำหรับฉันตัวเลือกที่ 1 ดูเหมือนจะเป็นที่ยอมรับมากที่สุดเพราะมันแยก"สิ่งที่ฉันต้องการ"และ"ฉันต้องการ"ได้อย่างชัดเจน (มันยังมีเครื่องหมายคำถามระหว่างพวกเขา lol) การแคชแบบเต็มหน้าสามารถดำเนินการได้โดยใช้ URL แบบเต็ม (ตัวเลือกทั้งหมดจะประสบปัญหาเดียวกันอยู่แล้ว)

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


1
นั่นเป็นสองลำดับที่แตกต่างกัน การเรียงลำดับแรกตามวันที่จากมากไปน้อยและแบ่งความสัมพันธ์ตามชื่อจากน้อยไปมากเท่านั้น เรียงลำดับที่สองตามชื่อจากน้อยไปมากและแบ่งความสัมพันธ์ตามวันที่จากมากไปน้อย
Imran Rashid

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

7

ฉันต้องการใช้การชดเชยและ จำกัด พารามิเตอร์การสืบค้น

ชดเชย : สำหรับดัชนีของรายการในคอลเลกชัน

ข้อ จำกัด : สำหรับจำนวนรายการ

ลูกค้าสามารถอัปเดตออฟเซ็ตได้ดังต่อไปนี้

offset = offset + limit

สำหรับหน้าถัดไป

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

การอ้างอิง: https://metamug.com/article/rest-api-developers-dilemma.html#Requesting-the-next-page


5

กำลังมองหาแนวทางปฏิบัติที่ดีที่สุดที่ฉันพบในไซต์นี้:

http://www.restapitutorial.com

ในหน้าทรัพยากรมีลิงค์สำหรับดาวน์โหลดไฟล์. pdf ที่มีวิธีปฏิบัติที่ดีที่สุดสำหรับ REST ที่ผู้เขียนแนะนำ นอกจากนี้ยังมีหัวข้อเกี่ยวกับการให้เลขหน้า

ผู้เขียนขอแนะนำให้เพิ่มการสนับสนุนให้กับทั้งการใช้ส่วนหัวของช่วงและการใช้พารามิเตอร์แบบสอบถามสตริง

ขอร้อง

ตัวอย่างส่วนหัว HTTP:

Range: items=0-24

ตัวอย่างพารามิเตอร์เคียวรีสตริง:

GET http://api.example.com/resources?offset=0&limit=25

โดยที่offsetเป็นหมายเลขรายการเริ่มต้นและข้อ จำกัดคือจำนวนรายการสูงสุดที่จะส่งคืน

คำตอบ

การตอบสนองควรมีส่วนหัวช่วงเนื้อหาที่ระบุจำนวนรายการที่จะถูกส่งคืนและจำนวนรายการทั้งหมดที่ยังไม่ถูกเรียกคืน

ตัวอย่างส่วนหัว HTTP:

Content-Range: items 0-24/66

Content-Range: items 40-65/*

ใน. pdf มีคำแนะนำอื่น ๆ สำหรับกรณีที่เฉพาะเจาะจงมากขึ้น


4

ขณะนี้ฉันใช้รูปแบบคล้ายกับสิ่งนี้ในแอป ASP.NET MVC ของฉัน:

เช่น http://application/products/by-date/page/2

โดยเฉพาะมัน: http://application/products/Date/Ascending/3

อย่างไรก็ตามฉันไม่พอใจกับการรวมเพจและข้อมูลการเรียงลำดับในเส้นทางด้วยวิธีนี้

รายการของรายการ (ผลิตภัณฑ์ในกรณีนี้) ไม่แน่นอน เช่นครั้งต่อไปที่มีคนกลับไปที่ URL ที่มีพารามิเตอร์การเพจและการเรียงลำดับผลลัพธ์ที่พวกเขาได้รับอาจมีการเปลี่ยนแปลง ดังนั้นแนวคิดhttp://application/products/Date/Ascending/3ในการเป็น URL เฉพาะที่ชี้ไปที่ชุดผลิตภัณฑ์ที่ไม่เปลี่ยนแปลงจึงหายไป


1
ปัญหาแรกที่มีการเรียงลำดับในหลายคอลัมน์ใช้กับทั้ง 3 วิธีในความคิดของฉัน ดังนั้นมันจึงไม่ใช่โปร / คอนสำหรับพวกเขาเลย เกี่ยวกับประเด็นที่สอง: นั่นไม่สามารถเกิดขึ้นกับทรัพยากรใด ๆ ได้หรือ ตัวอย่างเช่นผลิตภัณฑ์สามารถแก้ไข / ลบได้เช่นกัน
andi

ฉันคิดว่าการเรียงลำดับในหลายคอลัมน์เป็น 'คอน' สำหรับทั้ง 3 วิธีเนื่องจาก url เพิ่งจะใหญ่ขึ้นและไม่สามารถจัดการได้มากขึ้น - ด้วยเหตุผลหนึ่งที่ฉันกำลังพิจารณาที่จะย้ายไปใช้พารามิเตอร์ของหน้า / การเรียงลำดับตาม สำหรับประเด็นที่สองฉันคิดว่ามีความแตกต่างทางแนวคิดพื้นฐานระหว่างตัวระบุถาวรที่ไม่ซ้ำกันเช่นรหัสผลิตภัณฑ์มากกว่ารายการผลิตภัณฑ์ชั่วคราว สำหรับผลิตภัณฑ์ที่ถูกลบข้อความเช่น 'ผลิตภัณฑ์นั้นไม่มีอยู่ในระบบ' จะบอกคุณบางอย่างเกี่ยวกับผลิตภัณฑ์นั้น
Steve Willcock

1
การลบเพจและการเรียงลำดับข้อมูลทั้งหมดออกจากเส้นทางนั้นดี และการผลักเข้าไปในพารามิเตอร์ POST นั้นไม่ดี สวัสดี? คำถามเกี่ยวกับ REST เราไม่ได้ใช้ POST เพียงเพื่อทำให้ URL สั้นลงใน REST คำกริยาทำให้รู้สึก
temoto

1
โดยส่วนตัวฉันจะไม่ใช้พารามิเตอร์แบบฟอร์มสำหรับการสืบค้นเพราะเกือบจะต้องใช้วิธีการ POST หรือ PUT HTTP (เนื่องจากมีเนื้อความอยู่ในคำขอ) GET ดูเหมือนว่าฉันชอบวิธีการที่เหมาะสมกว่าที่จะใช้เนื่องจากทั้ง POST และ PUT บ่งบอกถึงการปรับเปลี่ยนทรัพยากร เนื่องจากฉันจะไปกับการเพิ่มพารามิเตอร์การค้นหาเพิ่มเติมไปยัง URL เมื่อจำเป็นต้องเรียงลำดับตามหลายคอลัมน์
Paul D. Eden

1

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

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


1
เกี่ยวกับการที่คุณพูดถึงว่าจะเดาง่ายกว่านี้ก็ไม่สำคัญ หากสร้าง hypermedia API ผู้ใช้ไม่ควรคาดเดา URIs
JR Garcia

0

ฉันเคยใช้โซลูชัน 3 มาก่อน (ฉันเขียนแอพ django มากมาย) และฉันไม่คิดว่ามีอะไรผิดปกติกับมัน มันสามารถสร้างได้เหมือนอย่างที่สอง (ในกรณีที่คุณต้องทำการขูดมวลหรือสิ่งที่คล้ายกัน) และดูสะอาดกว่า นอกจากนี้ผู้ใช้ของคุณสามารถคาดเดา URL (ถ้าเป็นแอพที่ต้องพบเจอกับสาธารณะ) และผู้คนสามารถไปที่ที่พวกเขาต้องการได้โดยตรง


0

ฉันใช้ในโครงการของฉันตาม URL ต่อไปนี้:

http://application/products?page=2&sort=+field1-field2

ซึ่งหมายความว่า - "ให้ฉันหน้าหน้าที่สองสั่งจากน้อยไปมากโดย field1 และจากนั้นมากไปน้อยโดย field2" หรือถ้าฉันต้องการความยืดหยุ่นที่มากขึ้นฉันใช้:

http://application/products?skip=20&limit=20&sort=+field1-field2

0

ฉันใช้ในรูปแบบต่อไปนี้เพื่อรับการบันทึกหน้าถัดไป http: // แอพลิเคชัน / ผลิตภัณฑ์ lastRecordKey = & pagesize = 20 & sort = ASC

RecordKey เป็นคอลัมน์ของตารางที่เก็บค่าลำดับใน DB ใช้เพื่อดึงข้อมูลหน้าเดียวในแต่ละครั้งจากฐานข้อมูล pageSize ใช้เพื่อกำหนดจำนวนระเบียนที่จะดึงข้อมูล sort ใช้เพื่อเรียงลำดับเร็กคอร์ดในลำดับขึ้นหรือลง

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