REST API Design: несколько вызовов против одного вызова API


19

Мы разрабатываем Rest API для веб-сайта электронной коммерции, который будет использоваться мобильными приложениями.

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

Два варианта выполнения вызовов API:

Одиночный звонок:

www.example.com/api/GetAllInHome

Несколько звонков:

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

Какой подход лучше всего подходит для остальных API? Один или несколько вызовов, объясните плюсы и минусы?

Что займет больше времени, чтобы ответить на запрос?

Ответы:


14

В теории множественные одновременные вызовы являются более гибкими и такими же быстрыми.

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

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

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

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

введите описание изображения здесь


Спасибо, на самом деле этот API используется в приложениях Android и I Phone, я хочу знать, когда загружается домашняя страница приложения, если я получу все ресурсы, такие как: ползунки, бренды, продукты в одном вызове API или сделать отдельный вызов API для отдельного ресурса, когда пользователи прокручивают вниз?
Shaijut

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

Итак, вы пришли к выводу, что лучше всего иметь единый API для одновременного вызова всех ресурсов домашней страницы, когда загружается домашняя страница приложения, и иметь разные API для слайдеров, брендов и т. Д. Отдельно для микро-сервиса, когда у вас есть раздел страницы, который нужно обновить ?
Shaijut

нет, если у вас нет веской причины, по которой эти разделы не просто загружаются страницей / основными данными
Ewan

У меня последний вопрос, как бы работали такие приложения, как amazon, flipkart? Не загружают ли они все ресурсы домашней страницы за один раз, когда пользователь открывает приложение? Я хочу знать, что будет лучшим подходом к этому.
Shaijut

5

TL; DR: если не учитывать все другие аспекты применения, выполнение одного вызова будет быстрее, чем выполнение нескольких вызовов. Выполнение вызовов асинхронно может сократить общее время, необходимое для выполнения данной операции с точки зрения вашего пользователя (что вполне может быть всем, что вам нужно), но в совокупности время, затрачиваемое на множественные вызовы, все равно будет больше.

В вашем случае, однако, я не уверен, что это полная история.

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

Основной принцип заключается в том, что у вас есть ресурс, на котором вы хотите выполнить действие. URI идентифицирует интересующий вас ресурс, и вы обычно используете HTTP-глаголы, чтобы указать, что вы хотите сделать с этим ресурсом.

В вашем конкретном случае все ваши методы имеют слово «get» в своем имени. Вы должны изменить глагол, используемый в HTTP-запросе, чтобы указать, что вы хотите «получить» ресурс, доступный в этом месте.

Ваша схема URI должна представлять логическую иерархию ресурсов, которые вы хотите сделать доступными для пользователей вашего API, поэтому в вашем случае я бы хотел использовать что-то вроде /api/products?category=slidersфильтрации вашей коллекции продуктов. Это означает, что когда клиенты хотят получить все ваши продукты, они могут просто пропустить строку запроса.


Спасибо, значит вы имеете в виду single urlfor API, но следует ли запрашивать разные ресурсы с помощью Query String? Также проверьте это .
Shaijut

Да, выполнение ваших вызовов асинхронно уменьшит абсолютное время, необходимое для извлечения данных, но в совокупности время будет еще больше; Дополнительные вызовы должны повторять издержки соединения TCP и двусторонней связи. Даже используя такие функции, как, не keep-aliveсобираюсь полностью удалить это.
Ричзилла

Категория будет свойством отдельного ресурса продукта. По логике вещей вы должны были бы получить коллекцию товаров и отфильтровать все товары в указанной категории
richzilla,

То есть, когда пользователь открывает домашнюю страницу приложения, один вызов должен перейти к API, который возвращает все ресурсы, упомянутые выше? или когда он выполняет прокрутку, следует делать отдельные звонки для конкретных ресурсов, что является наилучшей практикой?
Shaijut

Это зависит от того, что ваш пользователь ожидает увидеть в каждой точке вашего приложения. Возьмем, к примеру, этот веб-сайт. Когда вы нажимаете на него, questionsвы видите URI /questions, когда вы нажимаете на один из ваших любимых тегов, URI/questions/tagged/<tagname>
richzilla,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.