Лучшая практика REST API - PullRequest
       1

Лучшая практика REST API

0 голосов
/ 31 марта 2019

Интересно, что лучше для подобного случая с точки зрения API REST и дизайна базы данных.

Сценарий состоит в том, что у нас есть книги, у которых есть страницы со словами.

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

    GET /books/my_external_id/

  • Я хочуссылаться на страницы по номеру страницы (1,2,3 и т. д.) или внешнему идентификатору страницы (my_external_page_id, который будет уникальным).Нужно ли мне определять, на какой тип идентификатора страницы я ссылаюсь?

    GET /books/my_external_id/pages/1

    PUT /books/my_external_id/pages/1

    GET /pages/my_external_page_id

    PUT /pages/my_external_page_id

  • Я хочу получить и добавить слова на основе номера страницы для книги.

    GET /books/my_external_id/pages/1/words

    PUT /books/my_external_id/pages/1/words

    GET /pages/my_external_page_id/words

    PUT /pages/my_external_page_id/words

Каким будет полное решение здесь?

1 Ответ

1 голос
/ 31 марта 2019

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

Если вы GET читаете книгу, книги имеют номера страниц, последовательно пронумерованные от 1.

GET /books/my_external_id/pages/1

вышесказанное имеет смысл для меня, поскольку вы просите Page 1 из Book, обозначенного my_external_id. С этим Page будет связано Word. Итак, ваша модель данных состоит из следующих объектов:

Book имеет 1 или более Page имеет 1 или более Word

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

GET /books/my_external_id/pages/1
GET /books/my_external_id/pages/1/words/
GET /books/my_external_id/pages/1/words/23

Ваши другие точки входа (мини-библиотечные карточки?) Можно использовать для ввода модели данных в разных точках, при условии, что my_external_page_id и my_external_word_id уникальны для всех книг:

GET /pages/my_external_page_id
GET /words/my_external_word_id

но после этого вы окажетесь в режиме «модель данных», т.е. получите 50-е слово на странице:

GET /pages/my_external_page_id/50

с использованием 50-го слова вместо my_external_word_id, которое является точкой входа, а не моделью данных (50).

Обновление работает так же. Просто выберите модель объекта для работы:

получите 10-ю страницу книги:

GET /pages/my_external_page_id

получить все слова для этой страницы:

GET /pages/my_external_page_id/words

обновить 20-е слово на 10-й странице:

PUT /pages/my_external_page_id/words/20

Выше используется подход модели данных. my_external_page_id возвращает вам Page, который имеет Word экземпляров, и вы хотите обновить 20-й Word экземпляр, вместо использования my_external_word_id, который бы возвращал один Word экземпляр.

В конечном счете, ваша модель может быть:

Book имеет id, title, author, isbn, numberOfPages и listOfPages список Page экземпляров.

Page имеет id и список Word экземпляров. Он также может иметь number, но это относится только к Book, которому он принадлежит. Чтобы получить 10 Page из Book, вы можете либо сделать это через listOfPages in Book, либо повторить listOfPages, пока не найдете Page с number = 10.

Слово имеет id и text.

Этого должно быть достаточно, если вы не хотите обращаться к экземплярам Page и Word независимо от экземпляров Book, но в конечном итоге вам потребуется Book где-то в процессе, поскольку это единственное место Page s и Word с.

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