Пакетные запросы
Стандартная версия Р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"
}
]