OData REST API — мелкие хитрости (часть 3)

от автора

Продолжаем серию постов об особенностях использования протокола OData (см. часть 1, часть 2 ).

OData оговаривает что объекты можно создавать и апдейтить используя стандартный http запрос POST, PATCH и PUT. Тело запроса должно содержать JSON описание объекта, который мы хотим проапдейтить или добавить в базу.

Если добавляемый объект не существует — то создается новый объект.
Если объект существует — то поведение отличается:

  • PUT — заменяет объект на новый
  • PATCH — апдейтит поля объекты новыми значениями
  • POST — поведение не оговорено в стандарте (в databoom POST аналогичен PATCH)

4. добавление сложных объектов вместе со связанными объектами

В тексте OData стандарта затерялось несколько важных фраз:

A request to create an entity that includes related entities, represented using the appropriate inline representation, is referred to as a “deep insert” … On success, the service MUST create all entities and relate them.

В результате не все знают, что OData позволяет добавлять объекты вместе с дочерними объектами. Например, мы можем в коллекцию книг добавить новую книгу сразу вместе с ее авторами:

{     "id": "book1",     "title": "Cannibal’s Cookbook",     "author":[         {             "id": "person45",             "collections": [{ "id": "persons" }, { "id": "writers" }],             "firstname": "John",             "lastname": "Doe",             "age": 69,             "likes": [{ "id": "book55" }, { "id": "book19" }, { "id": "book66" }]         },         {             "id": "person191",             "collections": [{ "id": "persons" }, { "id": "experts" }],             "firstname": "Lamar",             "lastname": "Courtenay",             "age": 37,             "likes": [{ "id": "book186" }, { "id": "book18" }, { "id": "book31" }]         }     ] } 

В соответствии со стандартом будут созданы (или проапдейчены) все необходимые объекты и будет установлена связь между ними. После этого Вы сможете получить книгу, или книгу вместе с ее авторами, получить список людей (в который войдут новые люди), писателей, экспертов, получить людей с их книгами и т.д. (см. часть 1, часть 2 )

5. установление связей между объектами

1. Имея возможность добавлять объекты вместе с вложенными объектами, можно просто устанавливать связи между ними.

В вышеприведенном примере мы добавляли книгу с автором, который имел поле likes
«likes»: [{ «id»: «book186» }, { «id»: «book18» }, { «id»: «book31» }]

В соответствии со стандартом будут созданы все книги (или проапдейчены, если они уже существуют) и установлены связи между человеком и любимыми книгами. Но поскольку книги имеют только поле id то апдейтить нечего — остается только выставить связи.

2. Существует и другой способ установки связей.

Список любимых книг человека с id=’person191′ доступен через URL
…/persons(person191)/likes
мы можем добавить книги, послав запрос PUT, POST или PATCH используя этот URL

Замечание: OData допускает, что объекты могут ссылаться на множество других объектов и на них могут ссылаться сразу много объектов. Книга может иметь несколько авторов, а автор может написать много книг. Человек может быть и студентом, и преподавателем одновременно. Объекты могут принадлежать сразу многим коллекциям.


Если Вас заинтересовал данный пост, Вы можете также посмотреть нашу документацию и примеры использования REST API, а также примеры с использованием JavaScript библиотеки

Продолжение следует…

ссылка на оригинал статьи http://habrahabr.ru/post/263435/