Продолжаем серию постов об особенностях использования протокола 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 библиотеки

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

Комментарии (2)


  1. strangeworks
    23.07.2015 23:19
    +2

    Все это конечно хорошо, но вот в чем был смысл разбивать 3 микрозаметки на 3 поста? Я только, грубо говоря, достал попкорн начал погружаться в сюжет, а тут «бац!», и мне показывают «the end».


    1. shai_hulud
      24.07.2015 12:08

      Надо же парням пиарить свой продукт. Вот они и пытаются создать информационное присутствие на Хабре.