Это хорошая практика для обеспечения 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}, Это особенно тупой инструмент, и он не подходит для ваших нужд.

Другие вопросы по тегам