Rest api design для получения поля вложенного объекта - PullRequest
1 голос
/ 15 июня 2019

предположим, что у нас есть класс ниже

class Blog {
    Integer id;
    List<Post> posts;
}

class Post {
     Integer id;
     List<String> tags;
}

Если я хочу создать конечную точку для всех тегов определенного блога, какой вариант будет правильным.И тип возвращаемого значения - List.

blogs/{blog-id}/posts?field=tags

blogs/{blog-id}/post-tags

blogs/{blog-id}/posts/tags

blogs/{blog-id}/post/tags

Или любое предложение в порядке.Какой из них наиболее подходящий?

Ответы [ 3 ]

1 голос
/ 15 июня 2019

Какой из них наиболее подходящий?

REST не имеет значения, какое правописание вы используете для идентификаторов ресурсов, если они соответствуют RFC 3986 . Машинам все равно - что касается URI, это просто ключи кеша, не более того.

См. Также: Стефан Тилков ОТДЫХ: Я не думаю, что это означает то, что вы думаете, что делает .

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

blogs/{blog-id}/posts/tags
blogs/{blog-id}/post/tags

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

blogs/{blog-id}/posts?field=tags
blogs/{blog-id}/post-tags
blogs/{blog-id}/posts/tags

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

blogs/{blog-id}/posts/tags + ../images -> blogs/{blog-id}/posts/images

Нет особой причины, по которой сегмент tags должен быть ниже posts или даже blogs - это написание также "хорошо", если вы не столкнетесь с проблемами с неоднозначностью:

/tags/{blog-id}
1 голос
/ 15 июня 2019

Из перечисленных вами я бы выбрал первое или второе, в зависимости от варианта использования.

blogs/{blog-id}/posts?field=tags: указывает на то, что вам нужно только поле tags для элементов в коллекции. Я ожидаю, что в ответе все еще будет объект на сообщение, но будет присутствовать только поле tags. Если вам нужен отдельный список, вам нужно обработать его в клиенте.

blogs/{blog-id}/post-tags: Это будет использоваться для возврата одного, отдельного списка примененных тегов.

Вот почему я не пошел бы с другими:

blogs/{blog-id}/posts/tags: Это, вероятно, будет рассматриваться как пост под названием tags вместо того, чтобы возвращать все теги на постах.

blogs/{blog-id}/post/tags: В дополнение к вышесказанному, это подразумевает отдельный пост, а не коллекцию.

0 голосов
/ 18 июня 2019

Держите его в соответствии с вашим URI для сообщений.Предположим, у вас есть следующее:

/posts Возвращает ссылки на все сообщения
/posts/tags Читает теги для всех сообщений
/posts/id Читает сообщение
/posts/id/tags Читает тегидля сообщения

/blogs Возвращает ссылки на все блоги
/blogs/id Читает блог

Теперь, если вы хотите прочитать теги для всех сообщений, принадлежащих блогу, имеет смыслобъедините URI в цепочку;

/blogs/id/posts/tags Считывает теги для всех сообщений блога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...