Это хорошая практика для обеспечения API агрегации в Rest или нормальном дизайне WebAPI?
Я предоставил такой REST API для получения информации о базовом пользователе и информации о пространстве пользователя.
/ v1 / users / {user_id} / profile, который будет возвращать такой JSON:
`` `json {
"id": 123, "name": "foo", "sex": 0, "email": "foo@gmail.com",} `` `
/ v1 / users / {user_id} / space, который также возвращает JSON:
`` `json {" sum_space ": 100," used_space ": 20,}
Теперь, если у клиента (например, веб-страница, третье приложение) есть представление, которое должно показывать часть информации о пользователе (например, "имя", "пол") и часть информации о пространстве пользователя (например, "sum_space") одновременно Нужно ли предоставлять новый API агрегации, такой как /v1/users/{user_id}
?
И если я предоставлю такой агрегационный API, должен ли он возвращать все атрибуты User и Space? если я это сделаю, возвращаемое значение будет включать в себя некоторые неиспользуемые значения, которые увеличат пропускную способность сети. Но если этот API просто возвращает то, что нужно клиенту, что мне делать, если появятся новые требования к клиенту (например, просто получите имя пользователя и user_space пользователя)?
Если я не предоставляю API агрегации, все клиенты должны вызывать N раз для получения N видов ресурсов. если есть требование для поиска по фильтру (например, получение списка пользователей, сумма которых превышает 100), клиент может делать это только последовательно.
Я очень смущен из-за них, есть ли какое-либо руководство для подражания?
1 ответ
Предоставить базовые данные на /users/{id}
, Разрешить клиентам включать необязательный параметр запроса ?expand=profile, space
, Если они выбирают оба, они получают подробный ответ с данными со всех трех конечных точек. Если они только выбирают, скажем, profile
Затем они получают базовые данные и данные профиля.
Если вам нужно, чтобы они могли точно ограничивать те свойства, которые им необходимы, вы также можете ?include
параметр запроса, который может выглядеть GET /users/{id}?include=id,lastModifiedDate,profile.name&expand=profile
и может получить что-то вроде
{
"id": 25,
"lastModifiedDate": 0,
"profile": {
"name": "Bob Smith"
}
}
Вы можете возиться со структурой URI выше, как вам нравится. Может быть, вы предпочитаете GET /users/{id}?include=id,lastModifiedDate&expand=profile[name]
, Дело в том, что вы можете использовать параметры запроса, чтобы определить тип возвращаемой информации.
Другой вариант, если вы используете специфичные для поставщика типы MIME, - это использовать другой тип MIME для разных форм ответа. Один тип может возвращать профиль и пробел, а другой - только один или другой, когда делается запрос GET /users/{id}
, Это особенно тупой инструмент, и он не подходит для ваших нужд.