Hướng dẫn rest api pagination example php - ví dụ phân trang còn lại api php

Hãy làm một số phân trang! Về mặt kỹ thuật, HAL không có ý kiến ​​gì về việc tất cả những điều này sẽ hoạt động như thế nào. Nhưng may mắn thay, phần còn lại của thế giới còn lại. Như bạn có thể thấy trong ví dụ này, một cách tuyệt vời để xử lý phân trang là với các liên kết (từ http://phlyrestly.readthedocs.org/en/latest/halprimer.html#collections):

{
    "_links": {
        "self": {
            "href": "http://example.org/api/user?page=3"
        },
        "first": {
            "href": "http://example.org/api/user"
        },
        "prev": {
            "href": "http://example.org/api/user?page=2"
        },
        "next": {
            "href": "http://example.org/api/user?page=4"
        },
        "last": {
            "href": "http://example.org/api/user?page=133"
        }
    }
    "count": 3,
    "total": 498,
    "_embedded": {
        "users": [
            {
                "_links": {
                    "self": {
                        "href": "http://example.org/api/user/mwop"
                    }
                },
                "id": "mwop",
                "name": "Matthew Weier O'Phinney"
            },
            {
                "_links": {
                    "self": {
                        "href": "http://example.org/api/user/mac_nibblet"
                    }
                },
                "id": "mac_nibblet",
                "name": "Antoine Hedgecock"
            },
            {
                "_links": {
                    "self": {
                        "href": "http://example.org/api/user/spiffyjr"
                    }
                },
                "id": "spiffyjr",
                "name": "Kyle Spraggs"
            }
        ]
    }
}

Các chìa khóa ở đây - đầu tiên, trước, tiếp theo và cuối cùng - không tình cờ. Đây là những tiêu chuẩn toàn internet như bản thân. Vì vậy, nếu bạn sử dụng các tên này cho các liên kết của bạn, API của bạn sẽ phù hợp với rất nhiều API khác.

Điều quan trọng khác cần chú ý trong ví dụ này là phân trang được thực hiện với các tham số truy vấn. Về mặt kỹ thuật, có rất nhiều cách mà khách hàng có thể cho chúng tôi biết họ muốn trang nào cho một bộ sưu tập, như các tham số truy vấn hoặc tiêu đề yêu cầu. Nhưng thành thật mà nói, các tham số truy vấn là cách dễ nhất. Trong trường hợp của chúng tôi, chúng tôi sẽ làm theo chính xác những gì bạn thấy ở đây. Và với Thư viện Hateoas, điều này sẽ dễ dàng.

Đầu tiên, chúng ta hãy thiết lập một kịch bản để kiểm tra điều này trong programmers.feature. Trong kịch bản này, chúng tôi sẽ làm một cái gì đó thực sự tuyệt vời: chúng tôi sẽ theo các liên kết để phân trang. Tôi muốn có thể truy cập tài nguyên thu thập của chúng tôi, lấy URL cho liên kết next này và thực hiện yêu cầu thứ hai cho liên kết next và thực sự xem những gì trên trang 2.

Đối với phân trang của chúng tôi, chúng tôi sẽ hiển thị 5 lập trình viên trên mỗi trang. Trong Given, chúng ta cần thêm một loạt các lập trình viên để thử điều này - Tôi sẽ dán vào một số mã rất giàu trí tưởng tượng cung cấp cho chúng ta 12 lập trình viên trong cơ sở dữ liệu:

... dòng 1 - 93
Kịch bản: Phân thông qua bộ sưu tập các lập trình viên: Paginate through the collection of programmers
Cho các lập trình viên sau đây tồn tại:the following programmers exist:
| Biệt danh | nickname |
| Lập trình viên1 | Programmer1 |
| Lập trình viên2 | Programmer2 |
| Lập trình viên3 | Programmer3 |
| Lập trình viên4 | Programmer4 |
| Lập trình viên5 | Programmer5 |
| Lập trình viên6 | Programmer6 |
| Lập trình viên7 | Programmer7 |
| Lập trình viên8 | Programmer8 |
| Lập trình viên9 | Programmer9 |
| Lập trình10 | Programmer10 |
| Lập trình viên11 | Programmer11 |
| Lập trình viên12 | Programmer12 |
... dòng 110 - 166

Mọi thứ sau đó sẽ rất giống với tài nguyên thu thập thông thường, vì vậy tôi sẽ lấy một nửa sau của kịch bản đó. Tôi sẽ xóa mã trạng thái 200, vì chúng tôi đã kiểm tra điều này ở trên. Sau khi tôi thực hiện yêu cầu nhận đầu tiên, chúng tôi sẽ phân tích cú pháp thông qua phản hồi, tìm liên kết next và đưa ra yêu cầu nhận thứ hai. Tôi đã có một định nghĩa bước tích hợp để làm chính xác điều đó. Tôi sẽ chỉ nói: và tôi theo liên kết "tiếp theo":

... dòng 1 - 94
Kịch bản: Phân thông qua bộ sưu tập các lập trình viên: Paginate through the collection of programmers
Cho các lập trình viên sau đây tồn tại:the following programmers exist:
| Biệt danh |
| Lập trình viên1 |I request "GET /api/programmers"
| Lập trình viên2 |I follow the "next" link
| Lập trình viên3 |

| Lập trình viên4 |

| Lập trình viên5 |

... dòng 1 - 93
Kịch bản: Phân thông qua bộ sưu tập các lập trình viên: Paginate through the collection of programmers
Cho các lập trình viên sau đây tồn tại:
| Biệt danh |the "_embedded.programmers" property should contain "Programmer7"
| Lập trình viên1 |the "_embedded.programmers" property should not contain "Programmer2"
| Lập trình viên2 |the "_embedded.programmers" property should not contain "Programmer11"
| Lập trình viên3 |

| Lập trình viên4 |

| Lập trình viên5 |

php vendor/bin/behat features/api.programmer.feature:96

| Lập trình viên6 |

| Lập trình viên7 |

| Lập trình viên8 |
publicfunctionlistAction() function listAction()
| Lập trình viên9 |
| Lập trình10 |$this->getProgrammerRepository()->findAll();
| Lập trình viên11 |new CollectionRepresentation(
| Lập trình viên12 |
'programmers',,
'programmers'
... dòng 110 - 166
Mọi thứ sau đó sẽ rất giống với tài nguyên thu thập thông thường, vì vậy tôi sẽ lấy một nửa sau của kịch bản đó. Tôi sẽ xóa mã trạng thái 200, vì chúng tôi đã kiểm tra điều này ở trên. Sau khi tôi thực hiện yêu cầu nhận đầu tiên, chúng tôi sẽ phân tích cú pháp thông qua phản hồi, tìm liên kết next và đưa ra yêu cầu nhận thứ hai. Tôi đã có một định nghĩa bước tích hợp để làm chính xác điều đó. Tôi sẽ chỉ nói: và tôi theo liên kết "tiếp theo":
... dòng 1 - 94
... dòng 97 - 109

Khi tôi yêu cầu "GET /API /lập trình viên"

Và tôi theo liên kết "tiếp theo"
... dòng 112 - 166 Hateoas\Representation\PaginatedRepresentation;
Nếu bạn nhìn vào việc thực hiện đằng sau điều này - mà tôi đã viết - nó biết rằng chúng tôi đang sử dụng HAL, vì vậy nó biết để xem xét ____10, next,
php vendor/bin/behat features/api.programmer.feature:96
2 và đưa ra yêu cầu thứ hai cho điều đó.
publicfunctionlistAction() function listAction()
| Lập trình viên9 |
| Lập trình10 |
| Lập trình viên11 |new CollectionRepresentation(
| Lập trình viên12 |
'programmers',,
'programmers'
);
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(
... dòng 104 - 109
);
... dòng 111 - 114
}
... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là

php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:

... dòng 1 - 89
publicfunctionlistAction() function listAction()
{
... dòng 92 - 102
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(
... dòng 104 - 109
'api_programmers_list',,
array(),(),
... dòng 111 - 114
}
... dòng 116 - 205
);
... dòng 111 - 114
}
... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là

php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:

... dòng 1 - 89
publicfunctionlistAction() function listAction()
{
... dòng 92 - 102
$ thu thập,5;
$ trang,1;
$ giới hạn,
$ NumberOfPages
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(
... dòng 104 - 109
'api_programmers_list',,
array(),(),
... dòng 111 - 114
}
... dòng 116 - 205
);
Điều này cần một số đối số khác nhau. Đầu tiên là
php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:
... dòng 1 - 89 $response;
{

... dòng 92 - 102

$ thu thập,

... dòng 1 - 89
publicfunctionlistAction() function listAction()
{
... dòng 92 - 102
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(
... dòng 104 - 109
'api_programmers_list',,
array(),(),
... dòng 111 - 114
}
... dòng 116 - 205
);
Điều này cần một số đối số khác nhau. Đầu tiên là
php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:$this->createApiResponse($paginated, 200, 'json');
... dòng 1 - 89 $response;
}
... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là

php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:

php vendor/bin/behat features/api.programmer.feature:96

... dòng 1 - 89

{

... dòng 92 - 102

... dòng 1 - 89
{ function listAction(Request $request)
{
... dòng 92 - 102
}
... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là

php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:

... dòng 1 - 89
{ function listAction(Request $request)
{
... dòng 92 - 102
$ thu thập,'limit', 5);
$ trang,'page', 1);
$ giới hạn,
}
... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là

php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:

... dòng 1 - 89

Thay vào đó, tôi sẽ dán một số logic thủ công và sử dụng

php vendor/bin/behat features/api.programmer.feature:96
5:

... dòng 1 - 89
PublicFunctionListAction (Yêu cầu $ Yêu cầu) function listAction(Request $request)
{
... dòng 92 - 93
$ giới hạn = $ request-> truy vấn-> get ('giới hạn', 5);'limit', 5);
$ page = $ request-> truy vấn-> get ('trang', 1);'page', 1);
$ offset = ($ page - 1) * $ giới hạn;1) * $limit;
$ numberOfPages = (int) cle (đếm ($ lập trình viên) / $ giới hạn);
$ Collection = New CollectionRepresentation (new CollectionRepresentation(
Array_Slice ($ lập trình viên, $ offset, $ giới hạn),
... dòng 103 - 104
);
... dòng 106 - 117
}
... dòng 119 - 208

Vì vậy, tôi đang truy vấn cho tất cả các lập trình viên và sau đó cắt những cái đó xuống những cái tôi muốn. Đó không phải là một cách hiệu quả để làm điều này, nhưng chúng ta nên có một điểm cuối chức năng, được phân trang ngay bây giờ. Vì vậy, chúng ta hãy thử lại bài kiểm tra, và nó hoạt động!

php vendor/bin/behat features/api.programmer.feature:96

Yes!

Và để tận hưởng nó thêm một chút, chúng tôi có thể quay lại trình duyệt HAL, nhấn Go và vì chúng tôi ở trang 2, chúng tôi thấy các lập trình viên 6-10. Chúng tôi có thể theo các liên kết đến trang đầu tiên, sau đó đến trang cuối cùng để chỉ xem 2 lập trình viên đó. Bây giờ phân trang không khó và nó sẽ thực sự nhất quán trên API của bạn.

Hướng dẫn này sử dụng một khung hình vi mô không dùng được gọi là SILEX. Các nguyên tắc cơ bản của phần còn lại vẫn còn hợp lệ, nhưng mã chúng ta sử dụng không thể được sử dụng trong một ứng dụng thực.

Hướng dẫn này sử dụng thư viện PHP nào?

// composer.json
{
    "require": {
        "silex/silex": "~1.0", // v1.3.2
        "symfony/twig-bridge": "~2.1", // v2.7.3
        "symfony/security": "~2.4", // v2.7.3
        "doctrine/dbal": "^2.5.4", // v2.5.4
        "monolog/monolog": "~1.7.0", // 1.7.0
        "symfony/validator": "~2.4", // v2.7.3
        "symfony/expression-language": "~2.4", // v2.7.3
        "jms/serializer": "~0.16", // 0.16.0
        "willdurand/hateoas": "~2.3" // v2.3.0
    },
    "require-dev": {
        "behat/mink": "~1.5", // v1.5.0
        "behat/mink-goutte-driver": "~1.0.9", // v1.0.9
        "behat/mink-selenium2-driver": "~1.1.1", // v1.1.1
        "behat/behat": "~2.5", // v2.5.5
        "behat/mink-extension": "~1.2.0", // v1.2.0
        "phpunit/phpunit": "~5.7.0", // 5.7.27
        "guzzle/guzzle": "~3.7" // v3.9.3
    }
}

REST API đang phân trang là gì?

Bạn có thể phân trang phản hồi JSON được gọi từ API còn lại. Thứ tự của dữ liệu được giữ lại từ trang này sang trang khác. Với khả năng phân trang, bạn có thể nhanh chóng điền vào các bảng và thực hiện các cuộc gọi nghỉ mới mỗi khi bạn đến trang tiếp theo của dữ liệu trên bảng.paginate the JSON response that is called from the REST API. The order of the data is retained from page to page. Given the ability to paginate, you can quickly populate tables and make new REST calls every time you go to the next page of the data on the table.

Làm thế nào tôi có thể phân trang trong PHP?

Sau đó, bạn phải phân trang cơ sở dữ liệu này và hiển thị kết quả trên trang web ...
Bước 1: Tạo cơ sở dữ liệu.Tạo một cơ sở dữ liệu trong phpmyadmin bằng bảng điều khiển máy chủ XAMPP.....
Bước 2: Kết nối cơ sở dữ liệu.....
Bước 3: Lấy số trang hiện đang hoạt động.....
Bước 4: Hiển thị các bản ghi bảng.....
Bước 5: Hiển thị số trang trong URL ..

Làm thế nào phân trang được thực hiện trong API?

Có một vài phương pháp phân trang API khác nhau mà bạn có thể sử dụng tùy thuộc vào nhu cầu của API ...
Bù đắp phân trang.Phân tích bù sử dụng các lệnh `giới hạn` và` offset` đã có trong thư viện SQL làm tham số truy vấn.....
Keyset Pagination.Keyset Pagination lấy một gợi ý từ tìm kiếm cơ sở dữ liệu SQL.....
Tìm kiếm phân trang ..

Phương pháp nào được coi là hiệu quả nhất cho việc phân trang trong API REST?

Phương pháp bù là cách phổ biến nhất để phân trang tài nguyên (với phần bù trên truy vấn), nhưng nó kém hiệu quả hơn phương thức tìm kiếm.Offset method is the most common way to paginate resources (with an offset on query), but it's less efficient than the Search-after method.