Вопрос REST API о том, как обрабатывать коллекции настолько эффективно, насколько это возможно, и при этом соответствовать принципам REST - PullRequest
6 голосов
/ 31 мая 2011

Я довольно новичок в 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 ]

5 голосов
/ 31 мая 2011

Это строго вопрос проектирования.

Я мог бы определить ресурс 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, стандарт не устанавливает его.Но браузер может отличаться ... посмотрите на эту SO тему

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

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

4 голосов
/ 01 июня 2011

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


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

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


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

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

0 голосов
/ 30 апреля 2014

Вы можете использовать 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]), который возвращает книги с соответствующими идентификаторами

0 голосов
/ 31 мая 2011

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

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)
...