RESTful API с пакетными запросами

У нас есть не очень RESTful API, используемый нашим одностраничным приложением и мобильными приложениями.

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

Datawise у нас есть ресурсы с десятками связанных ресурсов. В некоторых случаях мы хотим вернуть эти связанные ресурсы или некоторые из них, а в других случаях - нет. Некоторые из них возвращаются медленно, поэтому они нужны нам только в определенных случаях.

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

поэтому мы рассмотрели конечную точку / batch, где запрос POST, содержащий несколько запросов в теле, может выполнять эти запросы параллельно на сервере. Как это https://developers.facebook.com/docs/graph-api/making-multiple-requests

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

Это приемлемый способ обработки связанных ресурсов? Или было бы лучше иметь URI для каждого ответа, который нам может понадобиться?


person user3271543    schedule 04.02.2014    source источник


Ответы (2)


HTTP / 2 решит эту проблему, позволив вам мультиплексировать запросы в одном соединении.

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

person Darrel Miller    schedule 05.02.2014

Пакетная обработка - это хорошо - не позволяйте шаблонам проектирования RESTful вести вас к снижению производительности.

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

Вы также можете использовать параметры запроса для выбора различных пакетных возвратов ресурсов. Например, для пользователя вы можете использовать что-то вроде:

GET /v1/users/1?related={none,all,basic}

Вы также можете использовать селектор полей:

GET /v1/users/1?data=addresses,history
person Mike Dunker    schedule 04.02.2014
comment
Пакетные запросы GET нарушают кэширование, которое является одним из краеугольных камней хорошей веб-производительности. - person Darrel Miller; 05.02.2014
comment
Преимущества кеширования начинаются со второго запроса к ресурсу. Пакетный запрос GET может иметь смысл, если шансы воспользоваться преимуществами кеширования невелики или отсутствуют. Даже при кэшировании каждый запрос представляет собой некоторые накладные расходы. - person KrekkieD; 18.05.2014