批量请求

发送包含多个 Facebook 图谱 API 调用的单个 HTTP 请求。系统会并行处理独立操作,并按顺序执行依赖操作。在所有操作完成后,系统会向您返回整合好的响应,并会关闭 HTTP 连接。

响应的顺序与请求中的操作顺序一致。您应对响应进行相应的处理,以确定哪些操作已成功,哪些操作应在后续操作中重试。

限制

  • 每次最多可批量发出 50 条请求。出于计算 API 调用限制和资源限制的考虑,批次中的各个请求将单独计算。例如,含有 10 个 API 调用的批量请求将计为 10 次调用,而批量请求中的每个调用都会以相同方式计入 CPU 资源限制中。请参阅我们的流量限制指南以获取更多信息。
  • 批量请求不可包含相同广告系列中的多个广告组。详细了解批量发出市场营销 API 请求

批量请求

批量请求的 JSON 对象由您的请求数组组成,并会返回采用 JSON 数组形式的逻辑 HTTP 响应数组。每个响应均应含有状态代码、可选标头数组和可选正文(正文为 JSON 编码字符串)。

如要发出批量请求,请将 POST 请求发送至 batch 参数是 JSON 对象的端点。

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 响应大很多,因此您可能需要将其移除,以提高效率。如要包含标头信息,请移除 include_headers 参数,或将其设为 true

响应示例

正文字段包含字符串编码的 JSON 对象:

[
  {
    "code": 200,
    "body": "{
      \"name\": \"Page A Name\",
      \"id\": \"PAGE-A-ID\"
      }"
  },
  {
    "code": 200,
    "body": "{
      \"name\": \"Page B Name\",
      \"id\": \"PAGE-B-ID\"
      }"
  }
]

复杂批量请求

您可以将一般使用不同 HTTP 方法的操作合并到一个批量请求中。GETDELETE 操作仅可含有 relative_urlmethod 字段,而 POSTPUT 操作则可以包含可选的 body 字段。与网址查询字符串类似,正文的格式应为原始 HTTP POST 字符串。

请求示例

以下示例中,我们将在同一操作中向由我们管理,并且我们拥有其发布权限的公共主页发布帖子,然后向公共主页的动态发布帖子:

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\": [{…}]}
    }
]

以下示例会为广告系列创建新广告,然后获取新创建对象的详细信息。请注意正文参数的 URLEncoding

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

在以下示例中,我们会将多个公共主页添加到商务管理平台:

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> 是应认领公共主页的商务管理平台的编号。
  • <PAGE_ID_n> 是要被认领的公共主页的编号。

错误

您请求的其中一个操作可能出现错误。原因可能是您无权执行此请求的操作。响应将与标准图谱 API 类似,但会以批量响应语法进行封装:

[
    { "code": 403,
      "headers": [
          {"name":"WWW-Authenticate", "value":"OAuth…"},
          {"name":"Content-Type", "value":"text/javascript; charset=UTF-8"} ],
      "body": "{\"error\":{\"type\":\"OAuthException\", … }}"
    }
]

批量请求中的其他请求应仍能成功完成,并如常返回状态代码 200

超时

如果完成较大或复杂的批量任务中的所有请求时间过长,则可能会超时。在这种情况下,结果是只能完成部分批量任务。在部分完成的批量任务中,成功完成的请求将返回状态代码为 200 的正常输出结果。对于未成功完成的请求,响应将为 null。如有任何未成功的请求,您都可以重试操作。

通过 JSONP 批量调用

与其余图谱 API 一样,批量 API 支持 JSONP。JSONP 回调函数可通过 callback 查询字符串或表单发布参数指定。

使用多个访问口令

一个批量请求中的单个请求可以将自己的访问口令指定为查询字符串或表单发布参数。在这种情况下,顶层访问口令将被视为回退口令,并会在单个请求未明确指定访问口令时得到使用。

当您要使用多个不同用户访问口令或公共主页访问口令查询 API,或需要使用应用访问口令进行某些调用时,这可能派上用场。

即使各个请求都包含自己的口令,您也必须添加访问口令作为顶层参数。

上传二进制数据

您可以在批量调用时上传多个二进制项。要实现这一操作,您需要将所有二进制项添加为您请求的 multipart/mime 附件,且每个操作都需使用 attached_files 属性来引用其二进制项。用户可在 attached_files 属性的值中添加附件名称的逗号分隔列表。

以下示例说明如何在单个批量调用中上传 2 张照片:

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
-->