Nov 27, 2025

วิธีจัดการการแบ่งหน้าใน REST API

ฝากข้อความ

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

ทำไมการแบ่งหน้าจึงมีความจำเป็น

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

เทคนิคการแบ่งหน้าทั่วไป

ออฟเซ็ต - จำกัดการแบ่งหน้า

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

ตัวอย่างเช่น หากเรามีจุดสิ้นสุด API/api/ผลิตภัณฑ์ที่ส่งคืนรายการสินค้าคำขอด้วยออฟเซ็ต = 20และขีดจำกัด = 10จะกลับมาผลิตภัณฑ์ที่ 21 เป็นผลิตภัณฑ์ที่ 30

ต่อไปนี้เป็นตัวอย่าง Python Flask ของการนำออฟเซ็ตไปใช้ - จำกัดการแบ่งหน้า:

จากการนำเข้าขวด Flask, คำขอ, jsonify app = Flask(__name__) products = [{"id": i, "name": f"Product {i}"} for i in range(100)] @app.route('/api/products', ways=['GET']) def get_products(): offset = int(request.args.get('offset', 0)) Limit = int(request.args.get('limit', 10)) paginated_products = products[offset:offset + Limit] ส่งคืน jsonify(paginated_products) ถ้า __name__ == '__main__': app.run(debug=True)

ข้อดี-

  • ง่ายต่อการเข้าใจและนำไปใช้
  • ทำงานได้ดีกับฐานข้อมูลที่รองรับจำกัดและชดเชยส่วนคำสั่งเช่น MySQL และ PostgreSQL

ข้อเสีย-

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

เคอร์เซอร์ - การแบ่งหน้าตาม

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

ตัวอย่างเช่น หากเรามีรายชื่อผู้ใช้ที่จัดเรียงตามวันที่สร้าง เคอร์เซอร์อาจเป็นวันที่สร้างของผู้ใช้คนสุดท้ายในหน้าก่อนหน้า จากนั้นเซิร์ฟเวอร์จะส่งคืนผู้ใช้ชุดถัดไปโดยมีวันที่สร้างมากกว่าค่าเคอร์เซอร์

นี่คือตัวอย่าง JavaScript ง่ายๆ ที่ใช้ Node.js และ Express:

const express = ต้องการ ('ด่วน'); แอป const = ด่วน (); ผู้ใช้ const = [ { id: 1 ชื่อ: 'ผู้ใช้ 1', create_at: '2023-01-01' }, { id: 2 ชื่อ: 'ผู้ใช้ 2', create_at: '2023-01-02' }, // ผู้ใช้เพิ่มเติม... ]; app.get('/api/users', (req, res) => { const cursor = req.query.cursor; const Limit = parseInt(req.query.limit) || 10; ให้ startIndex = 0; if (เคอร์เซอร์) { startIndex = users.findIndex (ผู้ใช้ => user.created_at > เคอร์เซอร์); } const paginatedUsers = users.slice(startIndex, startIndex + ขีดจำกัด); const nextCursor = paginatedUsers.length > 0 ? paginatedUsers[paginatedUsers.length - 1].created_at : null; app.listen(3000, () => { console.log('เซิร์ฟเวอร์ทำงานบนพอร์ต 3000'); });

ข้อดี-

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

ข้อเสีย-

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

การแบ่งหน้าหมายเลขหน้า

การแบ่งหน้าหมายเลขหน้าคล้ายกับออฟเซ็ต - จำกัดการแบ่งหน้า แต่แทนที่จะระบุออฟเซ็ต ลูกค้าขอหมายเลขหน้าเฉพาะ เซิร์ฟเวอร์จะคำนวณออฟเซ็ตตามหมายเลขหน้าและขีดจำกัด

ตัวอย่างเช่น หากขีดจำกัดคือ 10 รายการต่อหน้า คำขอสำหรับหน้าที่ 3 จะมีค่าชดเชยเป็น 20 (เนื่องจากoffset = (page_number - 1) * จำกัด-

จากการนำเข้าขวด Flask, คำขอ, jsonify app = Flask(__name__) products = [{"id": i, "name": f"Product {i}"} for i in range(100)] @app.route('/api/products', ways=['GET']) def get_products(): page = int(request.args.get('page', 1)) Limit = int(request.args.get('limit', 10)) offset = (หน้า - 1) * จำกัด paginated_products = products[offset:offset + Limit] ส่งคืน jsonify (paginated_products) ถ้า __name__ == '__main__': app.run(debug=True)

ข้อดี-

  • ง่ายสำหรับผู้ใช้ในการทำความเข้าใจ เนื่องจากคล้ายกับการแบ่งหน้าแบบดั้งเดิมในหน้าเว็บ
  • ง่ายต่อการปฏิบัติ

ข้อเสีย-

  • คล้ายกับการออฟเซ็ต - การจำกัดการแบ่งหน้า อาจประสบปัญหาด้านประสิทธิภาพเมื่อหมายเลขหน้าเพิ่มขึ้น
  • การจัดการการอัปเดตข้อมูลระหว่างการแบ่งหน้าอาจเป็นเรื่องยาก

ข้อควรพิจารณาสำหรับผู้ให้บริการ API

ในฐานะผู้ให้บริการ API เราต้องพิจารณาปัจจัยหลายประการเมื่อนำการแบ่งหน้าไปใช้:

การทำให้เป็นมาตรฐาน

เราควรปฏิบัติตามแนวทางปฏิบัติมาตรฐานของอุตสาหกรรมสำหรับการแบ่งหน้า ซึ่งรวมถึงการใช้ชื่อพารามิเตอร์ที่สอดคล้องกัน (เช่นชดเชย-ขีด จำกัด-หน้าหนังสือ-เคอร์เซอร์) และจัดทำเอกสารที่ชัดเจนเกี่ยวกับวิธีการทำงานของการแบ่งหน้า

PyrazinamideMethocarbamol

ข้อมูลเมตา

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

ตัวอย่างเช่น การตอบกลับอาจอยู่ในรูปแบบต่อไปนี้:

{ "data": [ { "id": 1, "name": "ผลิตภัณฑ์ 1" }, { "id": 2, "name": "ผลิตภัณฑ์ 2" } ], "total_items": 100, "total_pages": 10, "next_page": "/api/products?offset=20&limit=10", "prev_page": null }

ความปลอดภัย

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

บทสรุป

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

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

อ้างอิง

  • ริชาร์ดสัน, ลีโอนาร์ด และแซม รูบี้ บริการเว็บ RESTful โอไรลีย์มีเดีย 2550
  • แบงค์ส, อดัม. การสร้าง RESTful Web API ด้วย Python และ Flask สำนักพิมพ์ Packt, 2018
ส่งคำถาม