REST API: бесконечная прокрутка страниц в графическом интерфейсе, но возможность поиска по всем записям.

У меня есть Express, работающий на сервере Node.js, который служит бэкеном для моего внешнего приложения React.

Фронтенд-приложение извлекает данные из бэкэнда (хранящегося в Mongo) через вызов REST и отображает эти данные в таблице. Объем данных растет с каждым днем, поэтому я решил уменьшить объем данных, передаваемых во внешнее приложение, чтобы избежать ненужной нагрузки на серверную часть.

Я не уверен, что это правильный подход к этому, но я подумал, что я бы посмотрел на то, чтобы бэкен извлекал ограниченное количество записей, чтобы только эти данные отображались в таблице внешнего интерфейса.

Проблема возникает с поиском — когда пользователь хочет искать данные в таблице, мне нужно иметь возможность искать по всем записям, а не только по данным, загруженным в таблицу.

Я предполагаю, что одним из вариантов было бы заставить функцию поиска фактически запрашивать REST API вместо поиска самой таблицы.

Если я на правильном пути, думаю, я мог бы реализовать разбиение на страницы REST API где-то в примере, найденном в https://refactoringfactory.wordpress.com/2012/09/08/pagination-in-node.-js-and-express/. Другие предложения о том, как реализовать нумерацию страниц, приветствуются.

Мне бы очень хотелось получить некоторые отзывы о подходе, который я описал, и предложения по более разумным способам его реализации.

РЕДАКТИРОВАТЬ: я несколько изменил заголовок, включив в него «Бесконечная прокрутка страниц». Это то, что я хочу реализовать. На данный момент у меня есть щелчок по настройке разбиения на страницы, но я хотел бы заменить это на разбиение на страницы с бесконечной прокруткой.


person kenneho    schedule 24.08.2017    source источник


Ответы (2)


Я подумал, что стоит подумать о том, чтобы бэкен извлекал ограниченное количество записей, чтобы только эти данные отображались в таблице внешнего интерфейса.

Это обычная практика по моему опыту. Термин для этого - пагинация. Взгляните на этот вопрос SO о передовых методах разбиения на страницы в REST API: рекомендации API разбиения на страницы .

Проблема возникает с поиском — когда пользователь хочет искать данные в таблице, мне нужно иметь возможность искать по всем записям, а не только по данным, загруженным в таблицу.

Я предполагаю, что одним из вариантов было бы заставить функцию поиска фактически запрашивать REST API вместо поиска самой таблицы.

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

person TW80000    schedule 24.08.2017
comment
Спасибо за ответ! Я прочитаю сообщение, на которое вы ссылаетесь, и, надеюсь, на вопросы, которые у меня есть сейчас, будут даны ответы. Другим читателям: сразу после того, как TW80000 написал свой ответ, я отредактировал свой первоначальный заголовок и текст сообщения, включив в него нумерацию страниц. - person kenneho; 24.08.2017
comment
Похоже, что принятый ответ (stackoverflow.com/a/13905523/6650955) — это правильный путь. Насколько я понимаю, REST API возвращает структуру данных, содержащую как данные, так и курсор (предыдущий/следующий), и мне нужно соответствующим образом настроить своих клиентов. Верно? Я наткнулся на npmjs.com/package/react-infinite-scroller, который Я надеюсь, что смогу использовать. - person kenneho; 24.08.2017
comment
Да, я бы так и сделал. Очень красиво, надеюсь поможет. - person TW80000; 24.08.2017

Правильно, вы должны сделать

  • разбивка на страницы: вы можете реализовать это, предоставив 2 аргумента в остальной конечной точке для листинга

    • ?p=<number>: page number, defaults to 1
    • ?l=<number>: количество элементов на странице/длине страницы, по умолчанию число может быть от 10 до 100.
  • поиск: реализуйте его, предоставив 1 аргумент в остальной конечной точке для листинга

    • /?q=<string>: you can define to be what you want, maybe a string that matches with one or multiple fields of the data

Если вы хотите минимизировать сетевой трафик, вы также можете добавить еще один параметр для явного выбора полей, которые вы хотите вернуть, например:

  • /?f=<string>: строка может быть чем-то вроде id,name,age, поэтому API должен возвращать только эти три поля для каждой записи.

Все эти параметры должны быть приняты конечной точкой list в вашем RESTful API.

Пример:

http://example.com/api/cars/?p=2&l=15&q=toyota&f=id,brand,model,color

person jperelli    schedule 24.08.2017
comment
Спасибо, это отличная информация. Я ценю, что вы предоставили такие примеры, я много узнаю о конечных точках REST. - person kenneho; 26.08.2017