Пакетная отправка запросов

Стандартная версия Р7-Офис API позволяет легко получить данные для отдельного объекта и просмотреть связи между объектами. Она также позволяет получить некоторые данные для нескольких объектов за один запрос.

Если вашему приложению требуется возможность получать значительные объёмы данных за один запрос, или вам нужно внести изменения в несколько объектов за один раз, чаще всего более эффективным способом является пакетная отправка запросов, а не совершение нескольких отдельных HTTP запросов.

Для реализации данной возможности Р7-Офис API поддерживает пакетную отправку запросов, позволяющую передавать инструкции для нескольких операций за один HTTP запрос. Вы можете также уточнить зависимости между связанными операциями (это описано в разделе Пакетная отправка запросов, содержащих несколько методов ниже на этой странице). Р7-Офис обработает каждый из независимых запросов параллельно, а операции, для которых указаны зависимости, будут обработаны последовательно. По завершению всех операций, будет отправлен общий ответ и HTTP-соединение будет закрыто.

Простая пакетная отправка запросов

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

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

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

По завершению обеих операций Р7-Офис отправит ответ, в котором будут результаты всех операций. Для каждой из операций ответ будет включать статус-код, информацию заголовков и тело. Эти данные будут соответствовать ответам, которые можно было бы ожидать при отправке отдельных запросов на Р7-Офис API. Поле тела содержит объект 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\": \"Иван.Петров\", \"firstName\": \"Иван\", \"lastName\": \"Петров\", \"email\": \"ivan@gmail.com\", \"birthday\": \"1974-05-16T05:00:00.0000000+05:00\", \"sex\": \"male\", \"status\": 1, \"terminated\": null, \"department\": \"Пример группы\", \"workFrom\": \"2007-10-09T05:00:00.0000000+05:00\", \"location\": \"\", \"notes\": \"\", \"displayName\": \"Иван Петров\", \"title\": \"Управляющий\", \"contacts\": [], \"groups\": [{\"id\": \"eeb47881-6330-4b6d-8a32-82366d4caf27\", \"name\": \"Пример группы\", \"manager\": \"Елена.Иванова\"}], \"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 и method, операции POST и PUT могут содержать дополнительное необязательное поле body. Это поле должно иметь формат необработанной строки 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"
    }
]