Пакетные запросы

Стандартная версия Р7 API предназначена для того, чтобы упростить получение данных от отдельного объекта и просмотр связей между объектами. Это также включает ограниченную возможность получения данных для нескольких объектов в одном запросе.Если вашему приложению требуется единоразовый доступ к значительному объему данных или вам требуется изменить несколько объектов одновременно, эффективней будет группировать запросы, а не выполнять несколько отдельных HTTP — запросов. Для этого Р7 поддерживает пакетную обработку запросов, которая позволяет передавать инструкции для нескольких операций в одном HTTP – запросе. Вы также можете указать зависимости между связанными операциями (описанные ниже в разделе «Пакетные запросы» и содержащий методы). Р7 будет обрабатывать каждую из ваших автономных операций параллельно, а зависимые – последовательно. После завершения всех операций вам будет отправлен консолидированный ответ, а HTTP– соединение будет закрыто

Создание простого пакетного запроса

Пакетный API принимает массив логических HTTP-запросов,  представленных в виде массивов JSON — каждый запрос имеет метод(соответствующий HTTP-методу GET/PUT/POST/DELETE и т. д., относительный URL-адрес (часть URL-адреса после yourportal.r7-office.ru), массив необязательных заголовков (соответствует заголовкам HTTP) и необязательный текст (для запросов POST и PUT). Пакетный API возвращает массив логических HTTP-ответов, представленных в виде массивов JSON — каждый ответ имеет код состояния, массив необязательных заголовков и необязательное тело (представляющее собой строку в кодировке JSON).

Чтобы выполнить пакетный запрос, вы создаете объект JSON, описывающий каждую отдельную операцию, которую вы хотите выполнить и отправляете его в конечную точку API Р7 по адресу /api/2.0/batch. В следующем примере информация о профиле текущего пользователя и группе пользователей получаются в одном запросе:

batch = [
    {
        "method": "GET",
        "relativeUrl": "/api/2.0/people/@self"
    },
    {
        "method": "GET",
        "relativeUrl": "/api/2.0/group/@self"
    }
]

После завершения обеих операций, Р7 отправляет ответ, который инкапсулирует результат всех операций. Для каждой операции, ответ включает код состояния, информацию о заголовке и тело. Это эквивалентно ответу, который вы могли бы ожидать от каждой операции, если бы она выполнялась как необработанные запросы к Р7 API. Поле body содержит объект JSON в строковой кодировке:

Для приведенного выше запроса ожидаемый ответ будет иметь форму:

{
    "count": 1,
    "startIndex": 0,
    "status": 0,
    "statusCode": 200,
    "response": [
        {
            "status": 200,
            "headers": {
                "x-AspNet-Version": "2.0.50727",
                "access-Control-Allow-Origin": "*",
                "cache-Control": "private, max-age=0",
                "content-Type": "application/json; charset=UTF-8"
            },
            "data": "{\"count\": 1, \"startIndex\": 0, \"status\": 0, \"statusCode\": 200, \"response\": {\"id\": \"293bb997-28d8-4be0-8547-6eb50add1f3c\", \"userName\": \"Mike.Zanyatski\", \"firstName\": \"Mike\", \"lastName\": \"Zanyatski\", \"email\": \"mike@gmail.com\", \"birthday\": \"1974-05-16T05:00:00.0000000+05:00\", \"sex\": \"male\", \"status\": 1, \"terminated\": null, \"department\": \"Sample group\", \"workFrom\": \"2007-10-09T05:00:00.0000000+05:00\", \"location\": \"\", \"notes\": \"\", \"displayName\": \"Mike Zanyatski\", \"title\": \"Manager\", \"contacts\": [], \"groups\": [{\"id\": \"eeb47881-6330-4b6d-8a32-82366d4caf27\", \"name\": \"Sample group\", \"manager\": \"Jake.Zazhitski\"}], \"avatarMedium\": \"/data/0/userphotos/eeb47881-6330-4b6d-8a32-82366d4caf27_size_48-48.jpeg\", \"avatar\": \"/data/0/userphotos/eeb47881-6330-4b6d-8a32-82366d4caf27_size_82-82.jpeg\", \"avatarSmall\": \"/data/0/userphotos/eeb47881-6330-4b6d-8a32-82366d4caf27_size_32-32.jpeg\"}}"
        }
    ]
}

Пакетные запросы, содержащие несколько методов

Можно объединить операции, которые обычно используют разные методы HTTP, в один пакетный запрос. В то время как операции GET и DELETE должны иметь только поле relativeUrl и поле метода, операции POST и PUT могут содержать необязательное bodyfield. Это должно быть отформатировано как необработанная строка тела HTTP POST, аналогичная строке запроса URL. Следующий пример получает информацию о текущем контакте и обновляет контактную информацию для контакта с выбранным идентификатором за одну операцию:

batch = [
    {
        "method": "GET",
        "relativeUrl": "/api/2.0/people/@self"
    },
    {
        "method": "POST",
        "relativeUrl": "/api/2.0/people/{userid}/contacts", 
        "body": "contacts[0].Type=skype&contacts[0].Value=skypename&contacts[1].Type=msn&contacts[1].Value=msn_login"
    }
]