Позволяют отправить несколько вызовов API Graph в одном запросе HTTP. Зависимые операции обрабатываются последовательно, а независимые — параллельно. После выполнения всех операций вы получаете сводный ответ и HTTP-подключение закрывается.
Порядок ответов соответствует порядку операций в запросе. Учтите это при обработке ответов, и тогда вы сможете определить, какие операции выполнены успешно, а какие нужно повторно добавить в следующий запрос.
Пакетный запрос содержит объект JSON, состоящий из массива отдельных запросов. Он возвращает массив логических ответов HTTP, представленный в виде массивов JSON. Каждый ответ содержит код статуса, а также может включать в себя массив заголовков и текст (строку в кодировке JSON).
Чтобы сделать пакетный запрос, отправьте на конечную точку объект JSON в параметре batch запроса POST.
POST /ENDPOINT?batch=[JSON-OBJECT]
Пример пакетного запроса
В этом примере мы запрашиваем информацию о двух Страницах, которыми управляет наше приложение.
Для удобства чтения применено форматирование.curl -i -X POST 'https://graph.facebook.com/me?batch=
[
{
"method":"GET",
"relative_url":"PAGE-A-ID"
},
{
"method":"GET",
"relative_url":"PAGE-B-ID"
}
]
&include_headers=false // Included to remove header information
&access_token=ACCESS-TOKEN'Обработав пакетный запрос, API вернет ответ с результатами каждой операции. Поскольку возвращенные заголовки могут быть гораздо длиннее, чем фактический ответ API, иногда для повышения эффективности их имеет смысл удалить. Чтобы добавлять информацию о заголовках, удалите параметр include_headers или задайте для него значение true.
Пример ответа
Поле body содержит строку объекта в кодировке JSON.
[
{
"code": 200,
"body": "{
\"name\": \"Page A Name\",
\"id\": \"PAGE-A-ID\"
}"
},
{
"code": 200,
"body": "{
\"name\": \"Page B Name\",
\"id\": \"PAGE-B-ID\"
}"
}
]Операции, в которых используются разные методы HTTP, также можно добавить в один пакетный запрос. Операции GET и DELETE могут включать в себя только поля relative_url и method, а в операциях POST и PUT может содержаться необязательное поле body. Тело запроса должно иметь вид неформатированной строки HTTP-запроса POST (аналогично строке запроса URL).
Пример запроса
Этот запрос за раз создает публикацию на управляемой нами Странице и в ее ленте. Для этого у нас должно быть разрешение на публикацию на этой Странице.
curl "https://graph.facebook.com/PAGE-ID?batch=
[
{
"method":"POST",
"relative_url":"PAGE-ID/feed",
"body":"message=Test status update"
},
{
"method":"GET",
"relative_url":"PAGE-ID/feed"
}
]
&access_token=ACCESS-TOKEN"Результат может быть следующим:
[
{ "code": 200,
"headers": [
{ "name":"Content-Type",
"value":"text/javascript; charset=UTF-8"}
],
"body":"{\"id\":\"…\"}"
},
{ "code": 200,
"headers": [
{ "name":"Content-Type",
"value":"text/javascript; charset=UTF-8"
},
{ "name":"ETag",
"value": "…"
}
],
"body": "{\"data\": [{…}]}
}
]Запрос из следующего примера создает новое объявление для некой рекламной кампании, а затем получает сведения об этом объекте. Обратите внимание: для параметра body используется URL-кодирование.
curl \
-F 'access_token=...' \
-F 'batch=[
{
"method":"POST",
"name":"create-ad",
"relative_url":"11077200629332/ads",
"body":"ads=%5B%7B%22name%22%3A%22test_ad%22%2C%22billing_entity_id%22%3A111200774273%7D%5D"
},
{
"method":"GET",
"relative_url":"?ids={result=create-ad:$.data.*.id}"
}
]' \
https://graph.facebook.comКод в примере ниже добавляет несколько страниц в Business Manager:
curl \
-F 'access_token=<ACCESS_TOKEN>' \
-F 'batch=[
{
"method":"POST",
"name":"test1",
"relative_url":"<BUSINESS_ID>/owned_pages",
"body":"page_id=<PAGE_ID_1>"
},
{
"method":"POST",
"name":"test2",
"relative_url":"<BUSINESS_ID>/owned_pages",
"body":"page_id=<PAGE_ID_2>"
},
{
"method":"POST",
"name":"test3",
"relative_url":"<BUSINESS_ID>/owned_pages",
"body":"page_id=<PAGE_ID_3>"
},
]' \
"https://graph.facebook.com/v12.0"Здесь:
<ACCESS_TOKEN> — маркер доступа с разрешением business_management;<BUSINESS_ID> — идентификатор Business Manager, с которым должны быть связаны страницы;<PAGE_ID_n> — идентификаторы связываемых страниц.Иногда операции в запросе могут выдавать ошибки (например, если у вас нет разрешения на их выполнение). В этом случае возвращается ответ, похожий на стандартный ответ API Graph, но с синтаксисом ответа на пакетный запрос:
[
{ "code": 403,
"headers": [
{"name":"WWW-Authenticate", "value":"OAuth…"},
{"name":"Content-Type", "value":"text/javascript; charset=UTF-8"} ],
"body": "{\"error\":{\"type\":\"OAuthException\", … }}"
}
]При этом прочие запросы, добавленные в пакет, будут выполнены успешно и вернут стандартный ответ с кодом статуса 200.
Если пакетный запрос слишком велик или содержит слишком много компонентов и выполнение всех входящих в него операций занимает слишком много времени, может произойти тайм-аут. В этом случае пакетный запрос будет выполнен частично. Ответы на успешно выполненные запросы будут выглядеть обычным образом с кодом состояния 200, а на невыполненные запросы придет ответ null. Запросы, которые не удалось выполнить, можно повторить.
Как и все остальные компоненты API Graph, API Batch поддерживает формат JSONP. Чтобы задать функцию обратного вызова JSONP, используйте параметр строки запроса или формы POST callback.
В отдельных запросах, входящих в состав пакетного запроса, могут использоваться собственные маркеры доступа (в виде параметра строки запроса или формы POST). В этом случае маркер доступа верхнего уровня считается резервным и используется для выполнения запросов, в которых явным образом не указан другой маркер.
Такая возможность может пригодиться, если потребуется отправить в API запрос, содержащий маркеры доступа для разных пользователей или Страниц, или если для выполнения некоторых вызовов будет необходим маркер доступа к приложению.
Однако не забывайте, что в параметры верхнего уровня всегда необходимо добавлять маркер доступа, даже если во всех запросах в пакете содержатся собственные маркеры.
В рамках одного пакетного вызова можно загрузить несколько двоичных объектов. Для этого все двоичные файлы необходимо добавить в запрос в качестве составных вложений или вложений MIME, а в каждую операцию нужно вставить ссылку на соответствующие двоичные элементы с помощью свойства attached_files. Значением свойства attached_files может быть список имен вложений, разделенных запятыми.
В этом примере показано, как загрузить две фотографии в одном пакетном вызове:
curl
-F 'access_token=…' \
-F 'batch=[{"method":"POST","relative_url":"me/photos","body":"message=My cat photo","attached_files":"file1"},{"method":"POST","relative_url":"me/photos","body":"message=My dog photo","attached_files":"file2"},]' \
-F 'file1=@cat.gif' \
-F 'file2=@dog.jpg' \
https://graph.facebook.com