Phân trang hoạt động như thế nào trong API? Con trỏ và tính nhất quán

Phân trang hoạt động như thế nào trong API?

Scrapeless Agent Browser cho phép ứng dụng tương tác với các giao diện web phân trang khi việc thu thập kết quả đòi hỏi trạng thái trình duyệt hoặc thực thi JavaScript.

Phân trang hoạt động như thế nào trong API?

Phân trang API chia một tập hợp thành các cửa sổ kết quả và cung cấp cho client một cách để yêu cầu cửa sổ tiếp theo. API xác định một thứ tự, một chính sách kích thước trang, một cơ chế tiếp tục và một tín hiệu hoàn tất. Client tuân theo hợp đồng đó cho đến khi tập hợp kết thúc hoặc đến khi chạm giới hạn thu thập được phép của chính nó.

Phân trang giới hạn khối lượng công việc và kích thước phản hồi gắn với mỗi request. Nó cũng tạo ra một câu hỏi về tính nhất quán: điều gì xảy ra nếu bản ghi thay đổi trong khi client đang đi qua tập hợp? Một thiết kế phân trang đầy đủ giải thích cả cách client tiến lên và phiên bản tập hợp nào mà các bản ghi trả về đại diện.

Tóm tắt

  • Phân trang yêu cầu một thứ tự và một hợp đồng tiếp tục. Chỉ số trang tự nó không định nghĩa tính nhất quán.
  • Cursor nên được xử lý như các giá trị mờ (opaque). Trả lại token không thay đổi trong ngữ cảnh request được ghi tài liệu.
  • Một trang trống vẫn có thể có bước tiếp tục. Hãy sử dụng tín hiệu hoàn tất tường minh của API.
  • Khử trùng lặp không thể phục hồi các bản ghi bị bỏ sót. Việc duyệt ổn định và kiểm tra độ bao phủ vẫn là cần thiết.

Số trang và offset hoạt động như thế nào?

Phân trang theo số trang xác định một cửa sổ được đánh số, trong khi phân trang theo offset xác định có bao nhiêu kết quả đã sắp xếp sẽ được bỏ qua trước khi trả về một tập giới hạn. Một số trang có thể được chuyển đổi thành một offset ở bên trong, nhưng ánh xạ và cơ số đánh số thuộc về hợp đồng API. Đừng giả định rằng trang đầu tiên luôn được biểu diễn bởi cùng một số giữa các dịch vụ.

Các mẫu này thuận tiện cho các giao diện cần điều hướng trực tiếp đến một trang hiển thị. Chúng có thể trở nên kém dự đoán hơn khi tập hợp thay đổi trong quá trình duyệt. Nếu một mục được chèn trước offset tiếp theo, cửa sổ sau có thể chồng lấp với cửa sổ trước. Nếu một mục bị xoá, một cửa sổ phía sau có thể bỏ qua một mục.

Thứ tự phải được nêu rõ. Hành vi cơ sở dữ liệu của LIMIT và OFFSET minh họa lý do tại sao phân trang không có một thứ tự duy nhất có thể tạo ra các tập con không thể dự đoán. Chỉ sắp xếp theo thời gian tạo không duy nhất vẫn có thể để các trường hợp hòa chưa được giải quyết. Một định danh thứ cấp ổn định có thể giải quyết các trường hợp hòa đó khi mô hình dữ liệu cho phép.

Offset sâu cũng có thể yêu cầu backend xử lý các hàng không được trả về. Chi phí thực tế phụ thuộc vào index, bộ lọc và cách triển khai. Tránh hứa rằng điều hướng bằng số trang có chi phí hằng số chỉ vì mỗi phản hồi chứa cùng một số bản ghi tối đa.

Phân trang bằng cursor và keyset hoạt động như thế nào?

Phân trang bằng cursor trả về một giá trị tiếp tục mà client dùng để yêu cầu một cửa sổ khác. Keyset pagination là một kỹ thuật triển khai tiến lên tương đối so với các giá trị đã sắp xếp, như dấu thời gian và định danh cuối cùng đã chấp nhận. Một API có thể lộ ra một cursor mờ trong khi thay đổi triển khai nội bộ sau này.

Một cursor có thể mã hóa một vị trí, một tham chiếu snapshot, hoặc trạng thái phía server. Client không nên suy ra ý nghĩa của nó bằng cách giải mã. Một giá trị mờ là một ranh giới giao diện, và khả năng đọc có vẻ rõ ràng không khiến các trường bên trong của nó trở thành hợp đồng công khai được hỗ trợ.

Mẫu phân trang connection của GraphQL mô tả các edge, cursor và thông tin trang. GraphQL với tư cách là một ngôn ngữ không buộc mọi API phải áp dụng mẫu đó. Client vẫn cần schema thực tế và các ràng buộc cụ thể của server.

Keyset traversal giảm bớt một số vấn đề di chuyển gây ra bởi offset, nhưng nó không tự động là một snapshot đóng băng. Nếu trường sắp xếp thay đổi, một mục có thể di chuyển qua ranh giới duyệt. Nếu mục mới được chèn phía sau ranh giới, chúng có thể nằm ngoài lượt đi hiện tại. Hãy nêu rõ cam kết về tính nhất quán mà server thực sự cung cấp.

MẫuClient gửiMối quan tâm thiết kế chính
Số trangMột cửa sổ được đánh số và kích thước được hỗ trợDi chuyển trang khi nguồn thay đổi
OffsetSố lượng bỏ qua và giới hạnThứ tự ổn định và chi phí quét sâu
CursorMột giá trị tiếp tục do server cấpNgữ cảnh token, thời hạn và tính nhất quán
KeysetMột vị trí đã sắp xếp, thường được ẩn trong một cursorTính ổn định của khóa sắp xếp và xử lý hòa
Liên kết nextURL tiếp tục được trả vềXác thực điểm đích và phạm vi thông tin xác thực

Liên kết next và token nên được theo sau như thế nào?

Làm theo phần tiếp tục bằng cách sử dụng vị trí và quy tắc yêu cầu được ghi trong tài liệu của API. Một phản hồi có thể mang một token trong body, một URL tiếp theo trong metadata hoặc một liên kết có kiểu trong HTTP header. Việc đó Mô hình Web Linking định nghĩa các liên kết có kiểu và ngữ nghĩa quan hệ của chúng, nhưng client vẫn phải hiểu hợp đồng phân trang của API.

Giữ nguyên bộ lọc, sắp xếp và các ngữ cảnh khác khi cần. Một token được tạo cho một collection không nên được kết hợp với các bộ lọc không liên quan. Nếu một dịch vụ cho phép thay đổi kích thước trang trong khi duyệt, hãy sử dụng quyền được ghi trong tài liệu đó; nếu không hãy giữ yêu cầu nhất quán.

Xác thực điểm đích trước khi gắn thông tin xác thực vào một URL tiếp theo. Một liên kết trả về là dữ liệu, không phải là quyền chuyển tiếp bí mật đến bất kỳ host nào mà nó nêu tên. Hãy sử dụng các nguồn gốc dịch vụ được phép và phạm vi xác thực được định nghĩa bởi tích hợp. Tránh xây dựng URL bằng cách nối văn bản con trỏ chưa được escape.

Tạo checkpoint cho phần tiếp tục cùng với ngữ cảnh của nó. Một token được lưu trữ mà không có collection, bộ lọc, thứ tự và ranh giới đầu ra đã chấp nhận sẽ khó sử dụng đúng sau này. Một số con trỏ hết hạn, vì vậy việc lưu trữ đơn thuần không đảm bảo có thể tiếp tục lại.

Làm Thế Nào Để Client Biết Collection Đã Hoàn Tất?

Client biết collection đã hoàn tất khi tín hiệu kết thúc được ghi trong tài liệu API được đáp ứng. Tín hiệu có thể là thiếu liên kết tiếp theo, một next token rỗng hoặc một cờ thông tin trang rõ ràng. Một trang ngắn hoặc mảng rỗng chỉ đủ khi hợp đồng nói rằng nó là đủ.

Hướng dẫn phân trang AIP đưa ra một ví dụ cụ thể: một phản hồi có thể chứa ít kết quả hơn yêu cầu, bao gồm cả không có kết quả, trong khi vẫn trả về một continuation token. Hành vi đó không phải là phổ quát, nhưng nó bác bỏ giả định rằng một trang rỗng luôn có nghĩa là quá trình duyệt đã kết thúc.

Theo dõi riêng lý do kết thúc. Nguồn kết thúc, giới hạn số bản ghi phía client, giới hạn thời gian trôi qua, token không hợp lệ và lỗi truy cập mô tả các kết quả khác nhau. Một lần chạy bị giới hạn là một mẫu có biên hoặc một collection một phần. Nó không nên được gắn nhãn là hoàn tất chỉ vì vòng lặp dừng lại một cách bình thường.

Bảo vệ khỏi các phần tiếp tục lặp lại. Nếu một phản hồi trả về cùng một token và không có tiến triển đáng kể, client nên dừng ở trạng thái chưa được giải quyết thay vì lặp vô hạn. Các định danh bản ghi ổn định có thể giúp phát hiện trùng lặp, trong khi một dấu vân tay trang có thể giúp xác định phản hồi bị lặp lại. Cả hai đều không tự chứng minh phạm vi bao phủ đầy đủ.

Một Bản Ghi Duyệt Đúng Cần Bảo Tồn Điều Gì?

Một bản ghi duyệt bảo tồn đủ ngữ cảnh để giải thích collection nào đã được duyệt và đầu ra nào đã được chấp nhận. Trong một thiết kế export hoạt động minh họa, hãy lưu danh tính collection, bộ lọc, thứ tự sắp xếp, các khóa bản ghi đã chấp nhận và continuation gắn với ranh giới đầu ra bền vững cuối cùng.

Ghi nhận bản ghi trước khi nâng mốc tiến độ bền vững. Nếu không, một quy trình có thể ghi nhận tiến độ vượt qua các bản ghi mà nó chưa bao giờ lưu. Khi một giao dịch không thể bao trùm cả lưu trữ đầu ra và checkpoint, hãy định nghĩa cách hệ thống phát hiện và hòa giải khoảng trống đó.

Khử trùng lặp theo đúng danh tính. Một định danh tài nguyên có thể đủ cho bản export trạng thái mới nhất. Một luồng sự kiện có thể cần danh tính sự kiện. Một bản export lịch sử có thể cần cả tài nguyên và phiên bản. Xóa các định danh tài nguyên trùng lặp khỏi một lịch sử có phiên bản có thể loại bỏ các thay đổi hợp lệ.

Ghi lại cam kết về tính nhất quán của server. Phân trang theo snapshot có thể cung cấp một chế độ xem ổn định nếu server triển khai nó. Một lượt duyệt bằng live cursor có thể đại diện cho một collection đang thay đổi. Bên tiêu thụ nên biết liệu bản export là một snapshot, một lượt duyệt có giới hạn hay một luồng thay đổi đang diễn ra.

Phân Trang API Liên Quan Thế Nào Đến Phân Trang Website?

Phân trang website thêm một lớp tương tác phía trên chuỗi dữ liệu. Nút next có thể yêu cầu một API cursor, thay thế trang, thêm các thẻ nội dung hoặc chỉ cập nhật một phần DOM. Nhãn trang hiển thị không tiết lộ toàn bộ hợp đồng continuation.

Scrapeless Agent Browser có liên quan khi quy trình làm việc cần các tương tác trình duyệt đó. Khả năng cloud browser của nó hỗ trợ điều hướng các trang động; bộ thu thập của bạn vẫn chịu trách nhiệm về danh tính, quy tắc dừng và báo cáo mức độ đầy đủ.

Các mẫu phân trang web scraping cho thấy các dạng giao diện phổ biến. Hãy sử dụng trực tiếp API được ủy quyền và có tài liệu khi nó phù hợp với tác vụ. Một yêu cầu hiển thị trong công cụ dành cho nhà phát triển của trình duyệt không tự động thiết lập quyền sử dụng nó bên ngoài giao diện dự định.

Chọn kích thước trang từ các giới hạn được hỗ trợ và nhu cầu xử lý thực tế. Các trang lớn hơn có thể giảm số lượng yêu cầu nhưng tăng kích thước phản hồi và độ thô của checkpoint. Xem lại Scrapeless pricing khi có liên quan đến việc thu thập qua trình duyệt và đánh giá hạn ngạch và chính sách truy cập độc lập của API nguồn.

Kết Luận

Một client phân trang API đáng tin cậy tuân theo hợp đồng continuation, bảo tồn ngữ cảnh sắp xếp ổn định và ghi lại lý do lượt duyệt kết thúc. Trước khi gọi một bản export là hoàn tất, hãy xác định nó đại diện cho phiên bản collection nào và bằng chứng nào loại trừ các khoảng bị bỏ sót.

Đưa Lớp Collection Vào Thực Tiễn

Chọn khả năng collection của Scrapeless phù hợp với nguồn của bạn, sau đó áp dụng các quyết định vận hành và xác thực được mô tả ở trên.

Đăng ký ngay hôm nay và nhận $5 trong khoản tín dụng miễn phí — không cần thẻ tín dụng.

Nhận $5 Tín Dụng Của Bạn →

Câu Hỏi Thường Gặp

Phân trang bằng cursor có luôn luôn nhất quán không?

Không. Một cursor có thể đánh dấu một vị trí mà không đóng băng collection. Tính nhất quán phụ thuộc vào độ ổn định của thứ tự và hành vi snapshot hoặc live-view được ghi trong tài liệu của server.

Một trang rỗng có thể có trang tiếp theo không?

Có, một số API cho phép một cửa sổ kết quả rỗng với một continuation token. Hãy sử dụng tín hiệu hoàn tất được ghi trong tài liệu thay vì giả định rằng số lượng mục kết thúc collection.

Liệu khử trùng lặp có đảm bảo đầy đủ không?

Không. Khử trùng lặp loại bỏ các danh tính bị lặp lại khỏi kết quả đã thu thập. Nó không thể khôi phục các bản ghi bị bỏ qua vì quá trình thu thập đã chuyển sang chỗ khác hoặc một trang chưa bao giờ được chấp nhận.

Các trang có thể được lấy đồng thời không?

Chỉ khi API hỗ trợ các cửa sổ độc lập và chính sách truy cập của nó cho phép khối lượng công việc đó. Một chuỗi cursor thường yêu cầu lấy được một continuation trước khi yêu cầu cửa sổ tiếp theo.

Tài liệu tham khảo