Вопрос REST API о том, как обрабатывать коллекции настолько эффективно, насколько это возможно, и при этом соответствовать принципам REST

Я довольно новичок в REST, но насколько я понял, я понимаю, что следующий URL соответствует принципам REST. Где ресурсы выложены следующим образом:

/user/<username>/library/book/<id>/tags
          ^         ^           ^   ^
          |---------|-----------|---|- user resource with username as a variable
                    |-----------|---|- many to one collection (books)
                                |---|- book id 
                                    |- many to one collection (tags)


GET /user/dave/library/book             //retrieves a list of books id's
GET /user/dave/library/book/1           //retrieves info on book id=1
GET /user/dave/library/book/1/tags      //retrieves tags collection (book id=1)

Однако, как можно оптимизировать этот пример API? Скажем, например, у меня есть 10K книг в моей библиотеке, и я хочу получить подробную информацию о каждой книге в моей библиотеке. Должен ли я действительно заставить HTTP-вызов /library/book/<id> за каждый идентификатор, указанный в /library/book? Или я должен включить несколько идентификаторов в качестве параметров? /library/book/<id1>,<id2>... и вам нравится массовая загрузка со 100 идентификаторами одновременно?

Что принципы REST говорят о такой ситуации? и каково ваше мнение (я)?

Еще раз спасибо.

4 ответа

Решение

Это строго вопрос дизайна.

Я мог бы определить bookc ресурс и использовать его так:

GET /user/dave/library/book?bookList=...

как вы еще укажете bookList Аргумент - это вопрос того, как вы планируете использовать этот ресурс. Вы можете иметь, например:

GET /user/dave/library/book?bookList=1-10
GET /user/dave/library/book?bookList=1,2,5,20-25

или вы можете просто просмотреть все книги:

GET /user/dave/library/book?page=7&pagesize=50

Но на мой взгляд, особенно форма с длинным списком "случайных" идентификаторов кажется довольно непригодной. Может быть, я бы вместо этого определить filter параметр, чтобы я мог указать:

GET /user/dave/library/book?filter=key,value&filter=key,value

Что касается вашего вопроса об ограничении длины HTTP URL, то стандарт не устанавливает. Но браузер может отличаться... посмотрите на эту ТАКУЮ тему

Чтобы быть более строго RESTful, параметр запроса может быть указан через заголовки HTTP, но общая идея, которую я хотел передать, не меняется.

Надеюсь, что это подходит для вас...

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


/users/{username}/books/{bookId}

Что я не понимаю, так это сценарий передачи списка идентификаторов, разделенных запятыми. Вопрос в том, как добраться до идентификаторов? Я предполагаю, что за списком идентификаторов есть семантика, то есть они представляют результат фильтра. Так что вместо передачи идентификаторов я бы пошел поиск API. Упрощенный пример:


/users/dave/books?puchasedAfter=2011-01-01
 

Если вы хотите перебрать свою коллекцию из 10 000 книг, используйте параметры подкачки.

Это только мое мнение:

GET /user/dave/library/book/IDList      //retrieves a list of books id's
or
GET /user/dave/library/bookID           //retrieves a list of books id's

GET /user/dave/library/book             //retrieves a list of books
GET /user/dave/library/book/1           //retrieves info on book id=1
GET /user/dave/library/book/1-3         //retrieves info on book id>=1 and id <=3
GET /user/dave/library/book/1/tags      //retrieves tags collection (book id=1)

Вы можете использовать paginator

Некоторые успокаивающие API работают с пагинатором для огромных ресурсов, таких как:

http://example.org/api/books?page=2

Сервер доставляет, например, 100 записей (в данном случае книги) на страницу. И вы можете сортировать книги, используя sortby в вашем запросе на получение. С вышеуказанным запросом вы получите книги 101-200 (если их так много в базе данных). Ответ может рассказать вам о количестве книг и количестве страниц, о следующей и предыдущей страницах, но затем вы перейдете к HATEOAS.

В противном случае, если вы хотите получить определенные идентификаторы, я бы сделал это так:

http://example.org/books?id=[]2&id=[]5&id=[]7&id=[]21

Запрос на получение с массивом идентификаторов (id = [2,5,7,21]), который возвращает книги с соответствующими идентификаторами

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