@ryzhak

Как в yii2 restful в ответе сервера выбрать сразу все значения без пагинации?

Вообщем делаю сейчас мобильное приложение. Под него сделан бэкенд на yii2 rest api.
Ответ с сервака на запрос /games приходит примерно с такими значениями:
[{"championship":"Indian I-League","homeTeam":"Mumbai City","awayTeam":"SC Goa"},
{"championship":"Gulf Cup of Nations","homeTeam":"UAE","awayTeam":"Kuwait"}
...]


Заголовки ответа:
...
Server →Apache/2.4.7 (Ubuntu)
X-Pagination-Current-Page →1
X-Pagination-Page-Count →7
X-Pagination-Per-Page →20
X-Pagination-Total-Count →121
X-Powered-By →PHP/5.5.9-1ubuntu4.5


Так вот в ответе сервера за один запрос приходит только 20 значений, а всего значений, как видно из X-Pagination-Total-Count, 121. Поэтому чтобы выбрать все значения нужно сделать еще 6 запросов, вида:
/games?page=2
/games?page=3
/games?page=4 и т.д.

По логике когда юзер заходит в мобильное приложение, оно подгружает данные с сервака. Так вот при подгрузке мне надо все 7 запросов делать или можно как то одним сделать?

Надеюсь вопрос понятен
Thanks in advance
  • Вопрос задан
  • 7002 просмотра
Решения вопроса 1
@iplus
Можно задать размер страницы:
/games?per-page=1000

При запросе /games выполняется yii\rest\IndexAction, который возвращает ActiveDataProvider(['query' => $modelClass::find(),]). Т.е. объект Pagination там дефолтный ($pageParam = 'page', $pageSizeParam = 'per-page', $pageSizeLimit = [1, 50]). А дефолтный yii\data\Pagination пытается забрать параметры из $request->getQueryParams().
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Просто объясните разработчикам API что для REST лучше делать так:
/games?start_from=2&limit=20 + заголовок все X-Pagination-* заголовки отдавать... ну вроме разве что Page-Count и Current-Page

Таким образом если на клиенте придется поменять количество айтемов на страницу, не придется пинать разработчиков API.

Далее по вашей проблеме. 7 запросов это глупо. Если вам нужно сделать механизм кеширования данных например, то тогда да, тогда забираем все данных (хотя опять же можно делать это постепенно, все очень зависит от целей которые вы приследуете) и храним их у себя периодически проводя инвалидацию кеша.

В целом же это может быть и один запрос получающий первую порцию данных и подгружающий новую порцию по мере необходимости. Например если у вас реализована пагинация и вы хотите что бы все работало максимально быстро, можно при скроле скрина, если пользователь приближается к пагинации, сразу делать запрос за следующей пачкой данных, что бы пока пользователь тыкнул на кнопку next даные уже подгрузились бы. Ну или делать бесконечный скрол. Как уже говорилось - все зависит от вашего юзкейса. Но рекомендации относительно API все же передайте, ибо будут проблемы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы