Adobe Workfront规划API基础知识

IMPORTANT
本文中的信息介绍了Adobe Workfront Planning,它是Adobe Workfront的一项附加功能。
有关访问Workfront Planning的要求列表,请参阅Adobe Workfront Planning访问概述
有关Workfront Planning的一般信息,请参阅Adobe Workfront Planning入门

Adobe Workfront Planning API的目标是通过引入通过HTTP运行的RESTful架构来简化与Planning的构建集成。 本文档假设您熟悉REST和JSON响应。

有关完整的端点引用、请求/响应架构和特定于版本的详细信息,请参阅Workfront Planning API开发人员文档

身份验证

Workfront计划API使用OAuth 2.0进行身份验证。 凭据通过Adobe Developer Console进行设置。

根据您的集成类型,我们支持以下两个流程:

  • 服务器到服务器身份验证(JWT):用于无用户交互的自动集成和后端服务。 使用OAuth服务器到服务器凭据(客户端凭据授予 — 您的应用程序使用其客户端ID和密码直接进行身份验证以获取访问令牌,而无需用户登录或同意步骤)。

    有关信息,请参阅服务器到服务器身份验证

  • 用户身份验证(授权码流):用于代表特定用户进行操作的集成。 使用OAuth Web应用程序或单页应用程序凭据(授权代码授予 — 用户登录并同意,之后您的应用程序会收到授权代码,然后它会交换访问令牌)。

    有关信息,请参阅用户身份验证

要开始配置,请在Adobe Developer Console中创建一个项目,然后添加Workfront规划API以获取凭据。

要设置凭据,请在Workfront中创建OAuth2应用程序。

有关信息,请参阅为Workfront集成创建OAuth2应用程序

NOTE
Workfront Planning不支持/login端点和API密钥身份验证。 请勿使用sessionIDapiKey参数。

API版本控制

Planning API通过URL路径进行版本控制。

以下是当前支持的版本:

版本
发行日期
版本1
2024 年 7 月
版本2
2026年5月

有关当前支持的版本的详细信息,请参阅文章Workfront Planning API开发人员文档

我们建议在所有集成中明确定向某个版本:

https://{customer-domain}/maestro/api/v2/...

发布新的主要版本后,在告知弃用日期之前,以前的版本将继续可用。

按照Workfront发行说明操作,及时了解API更改。

URL结构和操作

通过将HTTP请求发送到对象的唯一URI来控制对象。 操作由HTTP方法指定。

方法
操作
GET
按ID检索单个对象,或搜索/列出对象
POST
创建新对象
PUT
替换现有对象(完全更新)
PATCH
部分更新现有对象(仅修改提供的字段)
删除
删除对象
NOTE
版本1中不支持 PATCH。 对所有更新使用PUT

有关完整的端点路径和请求/响应示例,请参阅developer.adobe.com/wf-planning上的​API引用

HTTP状态代码

Planning API返回标准HTTP状态代码:

代码
含义
200 OK
成功的GET、PUT或PATCH
201已创建
POST成功(已创建资源)
204无内容
成功DELETE
207多状态
批量操作已完成,但结果有好有坏,有些项目成功,有些项目失败。 有关详细信息,请查看单个项目响应。
400错误请求
无效请求 — 有关详细信息,请参阅错误响应
401未授权
身份验证令牌缺失或无效
403禁止访问
已验证权限不足
404未找到
资源不存在
409冲突
写入冲突,资源被另一个请求修改。 请使用最新版本重试。
429请求过多
超出速率限制
NOTE
版本1注意:​版本1为所有成功的操作(包括POST和DELETE)返回200 OK

错误处理

Planning API会以一致的格式返回错误。 每个错误响应包括人工可读消息、机器可读错误代码和支持升级请求ID。

示例错误响应:

json
{
  "title": "Validation failed",
  "status": 400,
  "detail": "Request validation failed. See 'errors' for details.",
  "errorCode": "VALIDATION_FAILED",
  "requestId": "req-123",
  "errors": [
    { "field": "name", "message": "must not be blank" }
  ]
}

使用errorCode (不是status)来推动程序化错误处理。 它提供了故障的最具体分类。

NOTE
版本1注意:​版本1错误响应使用数字type字段(例如40001)而不是字符串errorCode,并将详细信息包装在report对象中而不是顶级detail字段中。

过滤记录

在记录搜索请求中使用filter参数可仅返回符合特定条件的记录。 对于POST请求,filter是请求正文中的JSON属性。 对于GET请求,filter是包含JSON编码的筛选器组的查询参数。 过滤器使用具有显式逻辑运算符的类型复合结构。

json
{
  "filter": {
    "operator": "AND",
    "conditions": [
      { "fieldId": "<fieldId>", "condition": "IS", "value": "Active" },
      { "fieldId": "<fieldId>", "condition": "CONTAINS", "value": "marketing" }
    ]
  }
}

可以使用AND / OR运算符嵌套筛选器以生成复合条件:

json
{
  "filter": {
    "operator": "OR",
    "conditions": [
      {
        "operator": "AND",
        "conditions": [
          { "fieldId": "<fieldId>", "condition": "BETWEEN", "value": ["2024-03-31T20:00:00.000Z", "2024-04-01T20:00:00.000Z"] },
          { "fieldId": "<fieldId>", "condition": "IS", "value": "active" }
        ]
      },
      {
        "operator": "AND",
        "conditions": [
          { "fieldId": "<fieldId>", "condition": "IS_BETWEEN", "value": ["2024-04-15T00:00:00.000Z", "2024-04-16T00:00:00.000Z"] },
          { "fieldId": "<fieldId>", "condition": "IS", "value": "planned" }
        ]
      }
    ]
  }
}
NOTE
版本1注意:​版本1在filters对象中使用Mongo样式无类型运算符。 运算符以$为前缀(例如$and$or$is$contains$isBetween)。 在请求正文中传递分页参数(offsetlimit)和recordTypeId,而不是作为URL路径和查询参数传递。

字段类型和搜索修饰符

您可以使用带有字段的修饰符和过滤器来控制在结果中返回哪些数据。

有关示例,请参阅Workfront Planning API开发人员文档

使用搜索修饰符

Workfront Planning支持以下搜索修饰符:

修改者
示例
描述
可能值
CONTAINS
{"fieldId":"<id>","condition":"CONTAINS","value":"product"}
返回其字段值包含过滤器的记录
"新产品发布"
DOES_NOT_CONTAIN
{"fieldId":"<id>","condition":"DOES_NOT_CONTAIN","value":"product"}
返回字段值不包含过滤器的记录
"新启动项"
{"fieldId":"<id>","condition":"IS","value":"new product launch"}
返回字段值与过滤器完全匹配的记录
"新产品发布"
IS_NOT
{"fieldId":"<id>","condition":"IS_NOT","value":"product"}
返回字段值与过滤器不完全匹配的记录
"新产品发布"
IS_EMPTY
{"fieldId":"<id>","condition":"IS_EMPTY"}
返回字段值为空的记录
“”或null
IS_NOT_EMPTY
{"fieldId":"<id>","condition":"IS_NOT_EMPTY"}
返回字段值不为空的记录
"新产品发布"
GREATER_THAN
{"fieldId":"<id>","condition":"GREATER_THAN","value":"10"}
返回字段值大于筛选器的记录
"11"
GREATER_THAN_OR_EQUAL
{"fieldId":"<id>","condition":"GREATER_THAN_OR_EQUAL","value":"10"}
返回字段值大于或等于过滤器的记录
"10", "11"
LESS_THAN
{"fieldId":"<id>","condition":"LESS_THAN","value":"10"}
返回字段值小于筛选器的记录
"9"
LESS_THAN_OR_EQUAL
{"fieldId":"<id>","condition":"LESS_THAN_OR_EQUAL","value":"10"}
返回字段值小于或等于过滤器的记录
"9", "10"
IS_BETWEEN
{"fieldId":"<id>","condition":"IS_BETWEEN","value":["2024-01-01","2024-12-31"]}
返回字段值介于两个筛选值之间的记录
["2024-03-01","2024-06-30"]
IS_NOT_BETWEEN
{"fieldId":"<id>","condition":"IS_NOT_BETWEEN","value":["2024-01-01","2024-12-31"]}
返回字段值不在两个筛选值之间的记录
["2023-01-01","2025-06-30"]
IS_AFTER
{"fieldId":"<id>","condition":"IS_AFTER","value":"2024-01-01"}
返回日期字段值在筛选器之后的记录
"2024-06-01"
IS_BEFORE
{"fieldId":"<id>","condition":"IS_BEFORE","value":"2024-12-31"}
返回日期字段值在筛选器之前的记录
"2024-06-01"
IS_ANY_OF
{"fieldId":"<id>","condition":"IS_ANY_OF","value":["Active","Planned"]}
返回字段值与筛选器列表中的任意值匹配的记录
["Active","Planned","Complete"]
IS_NONE_OF
{"fieldId":"<id>","condition":"IS_NONE_OF","value":["Active","Planned"]}
返回字段值不与筛选器列表中的值匹配的记录
[“活动”,“计划”]
HAS_ANY_OF
{"fieldId":"<id>","condition":"HAS_ANY_OF","value":["Tag1","Tag2"]}
返回其多值字段包含任何筛选器值的记录
["Tag1","Tag2"]
HAS_ALL_OF
{"fieldId":"<id>","condition":"HAS_ALL_OF","value":["Tag1","Tag2"]}
返回多值字段包含所有筛选值的记录
["Tag1","Tag2"]
IS_EXACTLY
{"fieldId":"<id>","condition":"IS_EXACTLY","value":["Tag1"]}
返回其多值字段仅包含筛选值而不包含其他值的记录
["Tag1"]
HAS_NONE_OF
{"fieldId":"<id>","condition":"HAS_NONE_OF","value":["Tag1"]}
返回其多值字段不包含任何筛选器值的记录
["Tag1"]
NOTE
版本1注释: V1修饰符名称使用$-prefixed camelCase (例如$contains$isNot$isEmpty$greaterThan$greaterThanOrEqual$lessThan$lessThanOrEqual$isBetween$isNotBetween$isAnyOf$hasAllOf)。 每个修饰符的行为相同。

按字段类型支持的筛选条件

字段类型
支持的条件
文本,长文本
包含、DOES_NOT_CONTAIN、IS、IS_NOT、IS_EMPTY、IS_NOT_EMPTY
数字、百分比、货币
IS、IS_NOT、GREATER_THAN、GREATER_THAN_OR_EQUAL、LESS_THAN、LESS_THAN_OR_EQUAL、IS_EMPTY、IS_NOT_EMPTY
日期
IS、IS_NOT、IS_AFTER、IS_BEFORE、IS_BETWEEN、IS_NOT_BETWEEN、IS_EMPTY、IS_NOT_EMPTY
单选
IS、IS_NOT、IS_ANY_OF、IS_NONE_OF、IS_EMPTY、IS_NOT_EMPTY
多选,用户
HAS_ANY_OF、HAS_ALL_OF、IS_EXACTLY、HAS_NONE_OF、IS_EMPTY、IS_NOT_EMPTY
布尔
公式
包含、DOES_NOT_CONTAIN、IS、IS_NOT、IS_EMPTY、IS_NOT_EMPTY
创建者
IS、IS_NOT、IS_ANY_OF、IS_NONE_OF
更新者
IS、IS_NOT、IS_ANY_OF、IS_NONE_OF、IS_EMPTY、IS_NOT_EMPTY
created-at
IS、IS_NOT、IS_AFTER、IS_BEFORE、IS_BETWEEN、IS_NOT_BETWEEN
更新时间
IS、IS_NOT、IS_AFTER、IS_BEFORE、IS_BETWEEN、IS_NOT_BETWEEN、IS_EMPTY、IS_NOT_EMPTY
引用
HAS_ANY_OF、HAS_ALL_OF、IS_EXACTLY、HAS_NONE_OF、IS_EMPTY、IS_NOT_EMPTY
查找
取决于链接的字段类型
NOTE
版本1注释:​版本1使用前缀为$的运算符名称(例如$contains$greaterThan$isAnyOf$hasAllOf)。 每种字段类型支持的条件集是相同的。

按人员字段筛选

人员字段筛选器(usercreated-byupdated-byapproved-by)接受Adobe IMS用户ID和Workfront用户ID。 纯字符串值将解释为Adobe IMS用户ID。

要设置标识符类型以检查Workfront用户ID,您需要显式传递ididType参数。 对于Workfront用户ID,idType支持的值为“WF”;对于Adobe IMS用户ID,支持的值为“IMS”。

{
  "filter": {
   "operator": "AND",
    "conditions": [
      {
        "fieldId": "<userFieldId>",
        "condition": "HAS_ANY_OF",
        "value": [
          { "id": "63e3b13000078c1795146248182d15dc", "idType": "WF" }
        ]
      }
    ]
  }
}
NOTE
版本1注意: V1仅支持按用户的IMS ID进行筛选。

按外部ID筛选外部引用字段

外部引用字段将记录链接到其他Adobe系统(如Workfront项目或AEM Assets)中的对象。 在内部,Planning将Planning记录ID分配给这些对象。 要直接按其原始对象ID筛选此类字段,请将"matchExternalId": true添加到筛选条件。

此标志仅对referenceOptions.isExternaltrue的引用字段有效;对于非外部引用字段将忽略此标志。 如果无法解析单个字符串值,则请求将失败,并显示400 Bad Request。 如果提供了列表值,则未解析的条目将传递未更改并且只是不匹配而已。

{
  "filter": {
    "operator": "AND",
    "conditions": [
      {
        "fieldId": "<externalReferenceFieldId>",
        "condition": "IS_ANY_OF",
        "value": [
          "5f6a4f6e00000123456789abcdef0123",
          "/content/dam/wknd/en/adventures/bali-surf-camp"
        ],
        "matchExternalId": true
      }
    ]
  }
}
NOTE
版本1注意: V1不支持按外部对象ID进行筛选。

外部连接字段

Planning记录类型可以承载外部引用字段,这些字段将记录链接到其他Adobe系统中的对象,而不是其他Planning记录类型。

要通过API创建外部引用字段,请将新REFERENCE字段上的referenceOptions.recordTypeId设置为所需外部记录类型的ID。 服务器自动从目标记录类型派生referenceOptions.isExternal=true和连接元数据(connectionName, objectName)。

支持的外部对象类型包括Workfront对象(项目、任务、项目、项目群、项目组合、公司、组、团队、用户)和AEM Assets(资源、内容片段)。

NOTE
版本1注意: V1不支持创建外部连接字段。

排序

通过在请求中包含sort数组来按任何字段对结果进行排序:

json
{
  "sort": [
    { "fieldId": "F6527ecb25df57c441d92b9fc", "direction": "asc" },
    { "fieldId": "F658afcbd4a0273c67c346fd5", "direction": "desc" }
  ]
}

按顺序评估多个排序字段。 在分页时始终应用排序,以确保跨页面排序一致。

要对结果分组,请在排序时包含一个组数组:

{
  "sort": [{ "fieldId": "F001", "direction": "asc" }],
  "group": [{ "fieldId": "F002", "direction": "asc" }]
}
NOTE
版本1注意: V1使用sorting (不是sort)、groupingFieldIds (字段ID数组,不是group对象)和现已弃用的rowOrderViewId来应用现有视图的行顺序。 版本中不支持这些V1参数

场投影

要限制响应中返回的字段,请使用逗号分隔列表的fieldIdsfieldAliases查询参数。 这减小了响应有效负载的大小,建议用于高容量集成或对延迟敏感的集成。

NOTE
版本1注释:​版本1使用?attributes=进行投影(例如?attributes=data,createdBy),而不是?fieldIds=?fieldAliases=

分页

Planning API支持分页响应以管理大型数据集。

  • 基于游标的分页​用于工作区、记录类型、字段和视图。 传递上一个响应中的cursor值以检索下一页。 基于光标的响应包括hasMore标志,用于指示是否有更多页面。
  • 基于页面的分页​用于记录搜索。 使用pagesize作为查询参数。 在分页时始终应用排序,以确保跨页面排序一致。 请注意,分页是基于零的,因此要检索第二页的结果,请使用“page=1”作为参数。

例如,使用以下请求从记录搜索中检索包含500条记录的第二页:

POST /v2/record-types/{recordTypeId}/records/search?page=1&size=500
{
  "sort": [{ "fieldId": "F6527ecb25df57c441d92b9fc", "direction": "asc" }],
  "filter": { "operator": "AND", "conditions": [
    { "fieldId": "<fieldId>", "condition": "IS", "value": "active" }
  ] }
}

所有分页的响应都包括一个结构化包络,指示是否还有更多结果可用。 在分页时始终应用排序,以确保跨页面排序一致。

NOTE
版本1注释: V1使用请求正文中传递的offsetlimit(默认为500,最大为2,000)。 要检索记录2001-4000,请在请求正文中设置“offset”:“2000”,“limit”:“2000”。 响应返回一个带有totalCount字段的平面记录数组。

批量操作

Planning API支持在单个请求中批量创建、更新、修补和删除记录。 有关终结点路径、请求格式和每个操作的记录限制,请参阅developer.adobe.com/wf-planning上的​API引用

NOTE
版本1注意:​批量操作在版本1中不可用。

权限

实体的权限通过专用权限API进行管理,独立于资源端点本身。 这允许您读取当前权限、管理共享列表以及独立于数据操作处理访问请求。 有关详细信息,请参阅文章Workfront规划API中的“API引用”部分。

NOTE
版本1注意:​版本1未公开公共权限API。 权限级别直接嵌入到资源响应DTO中。

将Planning API与Workfront自定义表单结合使用

您可以从Workfront自定义表单中的外部查找字段调用Planning API,以直接在Workfront对象中显示Planning数据。 有关详细信息,请参阅自定义表单中的外部查找字段示例

相关资源

有关更多与API相关的文档,另请参阅以下文章:

recommendation-more-help
workfront-help-quicksilver