Я пытаюсь оборачивать голову наилучшим способом решения концепций в API на основе REST. Плоские ресурсы, которые не содержат других ресурсов, не представляют проблемы. Там, где я столкнулся с трудностями, это сложные ресурсы.
Например, у меня есть ресурс для комиксов. ComicBook
имеет на нем всевозможные свойства, такие как author
, issue number
, date
и т.д.
В комиксе также есть список обложки 1..n
. Эти обложки являются сложными объектами. Они содержат много информации об обложке: художник, дата и даже базовое 64-кодированное изображение обложки.
Для GET
на ComicBook
я мог бы просто вернуть комикс и все обложки, включая их изображения base64. Это, вероятно, не имеет большого значения для получения одного комикса. Но предположим, что я создаю клиентское приложение, которое хочет перечислить все комиксы в системе в таблице.
Таблица будет содержать несколько свойств ресурса ComicBook
, но мы, разумеется, не захочет отображать все покрытия в таблице. Возвращение 1000 комиксов, каждая из которых имеет несколько обложек, привела бы к смехотворно большому количеству данных, проходящих через провод, данные, которые в этом случае не нужны конечному пользователю.
Мой инстинкт должен сделать Cover
ресурсом и иметь ComicBook
обложками. Итак, теперь Cover
- это URI. GET
на работе комиксов теперь, вместо огромного ресурса Cover
мы отправляем URI для каждой обложки, и клиенты могут извлекать ресурсы Cover, по мере необходимости.
Теперь у меня проблема с созданием новых комиксов. Конечно, мне захочется создать хотя бы одну обложку, когда я создаю Comic
, на самом деле это, вероятно, бизнес-правило.
Так что теперь я застрял, я либо заставить клиент для обеспечения бизнес - правил, первыми подав Cover
, получая URI для этой обложки, то POST
ING в ComicBook
с этим URI в списке, или мой POST
на ComicBook
берет в другом чем он выплевывает. Входящие ресурсы для POST
и GET
являются глубокими копиями, где исходящие GET
содержат ссылки на зависимые ресурсы.
Ресурс Cover
вероятно, необходим в любом случае, потому что я уверен, что в качестве клиента я бы хотел в некоторых случаях решить проблему покрытия. Таким образом, проблема существует в общей форме независимо от размера зависимого ресурса. В общем, как вы обрабатываете сложные ресурсы, не заставляя клиента просто "знать", как состоят эти ресурсы?