REST API
Flowable REST 通用原则
安装与认证
Flowable 为 Flowable 引擎提供了 REST API,可通过将 flowable-rest.war 部署到 Apache Tomcat 等 Servlet 容器来安装。此外,也可以在另一个 Web 应用中使用它:在你的应用中包含该 Servlet(和/或其映射),并将所有 flowable-rest 依赖加入 classpath。
默认情况下,Flowable 引擎会连接一个内存中的 H2 数据库。你可以在 WEB-INF/META-INF/flowable-app 文件夹下的 flowable-app.properties 文件中更改数据库设置。REST API 使用 JSON 格式(http://www.json.org),并构建在 Spring MVC(http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html)之上。
默认情况下,所有 REST 资源都要求一个具有 rest-access-api 权限的合法用户通过认证。如果希望任 何合法用户都能调用 REST API,可以将 flowable.rest.app.authentication-mode 设置为 any-user(在旧版本的 Flowable 中这是默认值)。
可以通过设置以下属性来配置一个能够访问 REST API 的默认用户:
flowable.rest.app.admin.user-id=rest-admin
flowable.rest.app.admin.password=test
flowable.rest.app.admin.first-name=Rest
flowable.rest.app.admin.last-name=Admin
REST 应用启动时,若该用户尚不存在则创建,否则直接获取。该用户会被授予 access-rest-api 权限,默认情况下访问 REST API 需要此权限。之后请务必修改此用户的密码。如果未设置 flowable.rest.app.admin.user-id,则不会创建任何用户或权限。因此,在初始设置完成后移除该属性并不会删除此前已配置的用户或权限。
使用基本 HTTP 访问认证,因此在发起请求时应始终包含 Authorization: Basic …== 请求头,或者将用户名和密码包含在请求 URL 中(例如 *http://username:password@localhost:8080/xyz*)。
我们建议将基本认证与 HTTPS 结合使用。
配置
Flowable REST Web 应用使用 Spring Java Configuration 来启动 Flowable Form 引擎、使用 Spring Security 定义基本认证安全,并定义用于特定变量处理的变量转换器。
可以通过修改 WEB-INF/META-INF/flowable-app/flowable-app.properties 文件夹中的 flowable-app.properties 文件来定义少量属性。
如果需要更高级的配置选项,可以在 flowable-custom-context.xml 文件中覆盖默认的 Spring Bean,该文件同样位于 WEB-INF/classes 文件夹中。
此文件中已以注释形式给出了一个示例配置。这里也是覆盖默认 RestResponseFactory 的地方:定义一个名为 restResponsefactory 的新 Spring Bean,并使用你自己的自定义实现类。
在 Tomcat 中使用
由于 Tomcat 的默认安全属性,默认不允许转义的正斜杠(%2F 和 %5C)(会返回 400 结果)。 这可能会影响部署资源及其数据 URL,因为该 URL 有可能包含转义的正斜杠。
当遇到意外的 400 结果问题时,设置以下系统属性:
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
最佳实践是,对下文所述的 HTTP 请求,始终将 Accept 和 Content-Type(在 POST/PUT JSON 时)请求头设置为 application/json。
方法与返回码
HTTP 方法与对应操作
| 方法 | 操作 |
|---|---|
| GET | 获取单个资源或获取资源集合。 |
| POST | 创建新资源。也用于执行请求结构过于复杂、无法放入 GET 请求查询 URL 的资源查询。 |
| PUT | 更新已有资源的属性。也用于对已有资源执行操作。 |
| DELETE | 删除已有资源。 |
HTTP 方法响应码
| 响应 | 描述 |
|---|---|
| 200 - Ok | 操作成功,已返回响应(GET 和 PUT 请求)。 |
| 201 - Created | 操作成功,实体已创建并在响应体中返回(POST 请求)。 |
| 204 - No content | 操作成功,实体已删除,因此不返回响应体(DELETE 请求)。 |
| 401 - Unauthorized | 操作失败。该操作需要设置 Authentication 请求头。若请求中已包含该请求头,则所提供的凭证无效,或用户无权执行此操作。 |
| 403 - Forbidden | 该操作被禁止,不应重试。这意味着是授权问题而非认证问题,即该操作不被允许。例如:删除属于正在运行流程的任务是不允许的,并且无论用户或流程/任务状态如何,永远不会允许。 |
| 404 - Not found | 操作失败。未找到请求的资源。 |
| 405 - Method not allowed | 操作失败。该方法不允许用于此资源。例如,尝试更新(PUT)部署资源将导致 405 状态。 |
| 409 - Conflict | 操作失败。它导致对某个资源的更新,而该资源已被另一操作更新,从而使本次更新失效。也可能表示正在集合中创建一个资源,但具有该标识符的资源已存在。 |
| 415 - Unsupported Media Type | 操作失败。请求体包含不支持的媒体类型。当请求体 JSON 包含未知属性或值、且其格式/类型不符合要求而无法被接受时,也会发生此错误。 |
| 500 - Internal server error | 操作失败。执行操作时发生了意外异常。响应体中包含错误详情。 |
除非请求的是二进制内容(例如部署资源数据),HTTP 响应的媒体类型始终为 application/json;此时则使用该内容的媒体类型。
错误响应体
发生错误时(客户端和服务端均包括,即 4XX 和 5XX 状态码),响应体包含一个描述所发生错误的对象。以下是任务未找到时 404 状态的示例:
{
"statusCode" : 404,
"errorMessage" : "Could not find a task with id '444'."
}
请求参数
URL 片段
属于 URL 一部分的参数(例如 http://host/flowable-rest/process-api/repository/deployments/\{deploymentId} 中的 deploymentId 参数)
在片段包含特殊字符时,需要进行适当转义(参见 URL 编码或百分号编码)。大多数框架都内置了此功能,但仍应加以注意。对于可能包含正斜杠的片段(例如部署资源),尤其需要这样做。
REST URL 查询参数
作为 URL 中查询字符串添加的参数(例如 http://host/flowable-rest/process-api/repository/deployments?name=Deployment 中使用的 name 参数)可以具有以下类型,并在相应的 REST API 文档中说明:
URL 查询参数类型
| 类型 | 格式 |
|---|---|
| String | 纯文本参数。可包含 URL 中允许的任意合法字符。对于 XXXLike 参数,字符串应包含通配符 %(经过正确的 URL 编码)。这样可以指定 like 搜索的意图。例如,'Tas%' 匹配所有以 'Tas' 开头的值。 |
| Integer | 表示整数值的参数。只能包含非小数的数字值,介于 -2.147.483.648 与 2.147.483.647 之间。 |
| Long | 表示 long 值的参数。只能包含非小数的数字值,介于 -9.223.372.036.854.775.808 与 9.223.372.036.854.775.807 之间。 |
| Boolean | 表示布尔值的参数。只能为 true 或 false。除此以外的所有其他值都会导致 '405 - Bad request' 响应。 |
| Date | 表示日期值的参数。使用 ISO-8601 日期格式(参见 维基百科上的 ISO-8601),同时包含时间和日期分量(例如 2013-04-03T23:45Z)。 |
JSON 体参数
JSON 参数类型
| 类型 | 格式 |
|---|---|
| String | 纯文本参数。对于 XXXLike 参数,字符串应包含通配符 %。这样可以指定 like 搜索的意图。例如,'Tas%' 匹配所有以 'Tas' 开头的值。 |
| Integer | 表示整数值的参数,使用 JSON 数字。只能包含非小数的数字值,介于 -2.147.483.648 与 2.147.483.647 之间。 |
| Long | 表示 long 值的参数,使用 JSON 数字。只能包含非小数的数字值,介于 -9.223.372.036.854.775.808 与 9.223.372.036.854.775.807 之间。 |
| Date | 表示日期值的参数,使用 JSON 文本。使用 ISO-8601 日期格式(参见 维基百科上的 ISO-8601),同时包含时间和日期分量(例如 2013-04-03T23:45Z)。 |
分页与排序
分页和排序参数可以作为 URL 中的查询字符串添加(例如 http://host/flowable-rest/process-api/repository/deployments?sort=name 中使用的 name 参数)。
变量查询 JSON 参数
| 参数 | 默认值 | 描述 |
|---|---|---|
| sort | 各查询实现不同 | 排序键的名称,其默认值和允许值因查询实现而异。 |
| order | asc | 排序顺序,可为 'asc' 或 'desc'。 |
| start | 0 | 用于结果分页的参数。默认从 0 开始返回结果。 |
| size | 10 | 用于结果分页的参数。默认大小为 10。 |
注意
请注意,start 参数用作查询的偏移量。例如,要将任务分成每页 3 条、共三页(9 条)来获取,我们会使用:
GET /runtime/tasks?start=0&size=3
GET /runtime/tasks?start=3&size=3
GET /runtime/tasks?start=6&size=3
JSON 查询变量格式
{
"name" : "variableName",
"value" : "variableValue",
"operation" : "equals",
"type" : "string"
}
变量查询 JSON 参数
| 参数 | 是否必需 | 描述 |
|---|---|---|
| name | 否 | 要包含在查询中的变量名称。在某些查询中使用 'equals' 时,它可以为空,用于查询具有给定值、且任意变量名的资源。 |
| value | 是 | 查询中所包含变量的值,应包含给定类型的正确格式。 |
| operator | 是 | 查询中使用的操作符,可取以下值:equals、notEquals、equalsIgnoreCase、notEqualsIgnoreCase、lessThan、greaterThan 、lessThanOrEquals、greaterThanOrEquals 和 like。 |
| type | 否 | 要使用的变量类型。省略时,类型将从 value 参数推断。任何 JSON 文本值都视为 string 类型,JSON 布尔值视为 boolean 类型,JSON 数字根据数字大小视为 long 或 integer 类型。建议在不确定时显式指定类型。开箱即用支持的类型列于下表。 |
默认查询 JSON 类型
| 类型名称 | 描述 |
|---|---|
| string | 值被视为并转换为 java.lang.String。 |
| short | 值被视为并转换为 java.lang.Integer。 |
| integer | 值被视为并转换为 java.lang.Integer。 |
| long | 值被视为并转换为 java.lang.Long。 |
| double | 值被视为并转换为 java.lang.Double。 |
| boolean | 值被视为并转换为 java.lang.Boolean。 |
| date | 值被视为并转换为 java.util.Date。JSON 字符串将使用 ISO-8601 日期格式进行转换。 |
变量表示
在处理变量(执行决策)时,REST API 在读取和写入时都使用一些通用原则和 JSON 格式。变量的 JSON 表示如下所示:
{
"name" : "variableName",
"value" : "variableValue",
"valueUrl" : "http://...",
"type" : "string"
}
变量 JSON 属性
| 参数 | 是否必需 | 描述 |
|---|---|---|
| name | 是 | 变量的名称。 |
| value | 否 | 变量的值。写入变量时若省略 value,则使用 null 作为值。 |
| valueUrl | 否 | 读取 binary 或 serializable 类型的变量时,此属性指向可获取原始二进制数据的 URL。 |
| type | 否 | 变量的类型。有关类型的更多信息见下表。写入变量时若省略此值,类型将根据原始 JSON 属性请求类型推断,且仅限于 string、double、integer 和 boolean。建议始终指定类型,以确保不会对类型做出错误假设。 |
变量类型
| 类型名称 | 描述 |
|---|---|
| string | 值被视为 java.lang.String。写入变量时使用原始 JSON 文本值。 |
| integer | 值被视为 java.lang.Integer。写入时,以 JSON 数字值作为转换基础,回退到 JSON 文本。 |
| short | 值被视为 java.lang.Short。写入时,以 JSON 数字值作为转换基础,回退到 JSON 文本。 |
| long | 值被视为 java.lang.Long。写入时,以 JSON 数字值作为转换基础,回退到 JSON 文本。 |
| double | 值被视为 java.lang.Double。写入时,以 JSON 数字值作为转换基础,回退到 JSON 文本。 |
| boolean | 值被视为 java.lang.Boolean。写入时,使用 JSON 布尔值进行转换。 |
| date | 值被视为 java.util.Date。写入时,JSON 文本将使用 ISO-8601 日期格式转换。 |
可以通过自定义 JSON 表示(简单值或复杂/嵌套 JSON 对象)来支持额外的变量类型。通过扩展 org.flowable.dmn.rest.service.api.DmnRestResponseFactory 上的 initializeVariableConverters() 方法,你可以添加额外的 org.flowable.rest.variable.RestVariableConverter 类,以支持将你的 POJO 转换为适合通过 REST 传输的格式,并将 REST 值转换回你的 POJO。实际到 JSON 的转换由 Jackson 完成。
部署
使用 Tomcat 时,请阅读 在 Tomcat 中使用。
部署列表
GET repository/deployments
URL 查询参数
| 参数 | 是否必需 | 值 | 描述 |
|---|---|---|---|
| name | 否 | String | 仅返回具有给定名称的部署。 |
| nameLike | 否 | String | 仅返回名称类似于给定名称的部署。 |
| category | 否 | String | 仅返回具有给定类别的部署。 |
| categoryNotEquals | 否 | String | 仅返回不具有给定类别的部署。 |
| tenantId | 否 | String | 仅返回具有给定 tenantId 的部署。 |
| tenantIdLike | 否 | String | 仅返回 tenantId 类似于给定值的部署。 |
| withoutTenantId | 否 | Boolean | 若为 true,仅返回未设置 tenantId 的部署。若为 false,则忽略 withoutTenantId 参数。 |
| sort | 否 | 'id'(默认)、'name'、'deployTime' 或 'tenantId' | 排序所依据的属性,需与 'order' 一起使用。 |
REST 响应码
| 响应码 | 描述 |
|---|---|
| 200 | 表示请求成功。 |
成功响应体:
{
"data": [
{
"id": "10",
"name": "flowable-examples.bar",
"deploymentTime": "2010-10-13T14:54:26.750+02:00",
"category": "examples",
"url": "http://localhost:8081/flowable-rest/service/repository/deployments/10",
"tenantId": null
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
}
获取一个部署
GET repository/deployments/{deploymentId}
获取部署 - URL 参数
| 参数 | 是否必需 | 值 | 描述 |
|---|---|---|---|
| deploymentId | 是 | String | 要获取的部署的 id。 |
获取部署 - 响应码
| 响应码 | 描述 |
|---|---|
| 200 | 表示已找到并返回该部署。 |
| 404 | 表示未找到请求的部署。 |
成功响应体:
{
"id": "10",
"name": "flowable-examples.bar",
"deploymentTime": "2010-10-13T14:54:26.750+02:00",
"category": "examples",
"url": "http://localhost:8081/flowable-rest/service/repository/deployments/10",
"tenantId" : null
}
创建新部署
POST repository/deployments
请求体:
请求体应包含 multipart/form-data 类型的数据。请求中应恰好包含一个文件,任何额外的文件都会被忽略。部署名称即为传入的文件字段的名称。如果需要在单个部署中部署多个资源,请将这些资源压缩为一个 zip,并确保文件名以 .bar 或 .zip 结尾。
可以在请求体中传递一个名为 tenantId 的额外参数(表单字段)。该字段的值将用作本次部署所属租户的 id。
创建新部署 - 响应码
| 响应码 | 描述 |
|---|---|
| 201 | 表示部署已创建。 |
| 400 | 表示请求体中没有内容,或内容的 MIME 类型不支持部署。状态描述中包含更多信息。 |
成功响应体:
{
"id": "10",
"name": "flowable-examples.bar",
"deploymentTime": "2010-10-13T14:54:26.750+02:00",
"category": null,
"url": "http://localhost:8081/flowable-rest/service/repository/deployments/10",
"tenantId" : "myTenant"
}
删除一个部署
DELETE repository/deployments/{deploymentId}
删除部署 - URL 参数
| 参数 | 是否必需 | 值 | 描述 |
|---|---|---|---|
| deploymentId | 是 | String | 要删除的部署的 id。 |
删除部署 - 响应码
| 响应码 | 描述 |
|---|---|
| 204 | 表示已找到该部署并已删除。响应体按设计为空。 |
| 404 | 表示未找到请求的部署。 |
列出部署中的资源
GET repository/deployments/{deploymentId}/resources
列出部署中的资源 - URL 参数
| 参数 | 是否必需 | 值 | 描述 |
|---|---|---|---|
| deploymentId | 是 | String | 要获取其资源的部署的 id。 |
列出部署中的资源 - 响应码
| 响应码 | 描述 |
|---|---|
| 200 | 表示已找到该部署并已返回资源列表。 |
| 404 | 表示未找到请求的部署。 |
成功响应体:
[
{
"id": "diagrams/my-process.bpmn20.xml",
"url": "http://localhost:8081/flowable-rest/service/repository/deployments/10/resources/diagrams%2Fmy-process.bpmn20.xml",
"dataUrl": "http://localhost:8081/flowable-rest/service/repository/deployments/10/resourcedata/diagrams%2Fmy-process.bpmn20.xml",
"mediaType": "text/xml",
"type": "processDefinition"
},
{
"id": "image.png",
"url": "http://localhost:8081/flowable-rest/service/repository/deployments/10/resources/image.png",
"dataUrl": "http://localhost:8081/flowable-rest/service/repository/deployments/10/resourcedata/image.png",
"mediaType": "image/png",
"type": "resource"
}
]
- mediaType:包含该资源的媒体类型。它使用一个(可插拔的)MediaTypeResolver 解析,默认包含数量有限的 MIME 类型映射。
- type:资源的类型,可能取值:
- resource:普通资源。
- processDefinition:包含一个或多个流程定义的资源。部署器会拾取此资源。
- processImage:表示已部署流程定义图形布局的资源。
单个资源结果 JSON 中的 dataUrl 属性包含用于获取二进制资源的实际 URL。
获取一个部署资源
GET repository/deployments/{deploymentId}/resources/{resourceId}
获取部署资源 - URL 参数
| 参数 | 是否必需 | 值 | 描述 |
|---|---|---|---|
| deploymentId | 是 | String | 请求资源所属部署的 id。 |
| resourceId | 是 | String | 要获取的资源的 id。如果 resourceId 包含正斜杠,请务必对其进行 URL 编码。例如:使用 'diagrams%2Fmy-process.bpmn20.xml' 而非 'diagrams/Fmy-process.bpmn20.xml'。 |
获取部署资源 - 响应码
| 响应码 | 描述 |
|---|---|
| 200 | 表示部署和资源均已找到,并已返回该资源。 |
| 404 | 表示未找到请求的部署,或部署中不存在具有给定 id 的资源。状态描述中包含更多信息。 |
成功响应体:
{
"id": "diagrams/my-process.bpmn20.xml",
"url": "http://localhost:8081/flowable-rest/service/repository/deployments/10/resources/diagrams%2Fmy-process.bpmn20.xml",
"dataUrl": "http://localhost:8081/flowable-rest/service/repository/deployments/10/resourcedata/diagrams%2Fmy-process.bpmn20.xml",
"mediaType": "text/xml",
"type": "processDefinition"
}
- mediaType:包含该资源的媒体类型。它使用一个(可插拔的)MediaTypeResolver 解析,默认包含数量有限的 MIME 类型映射。
- type:资源的类型,可能取值:
- resource:普通资源。
- processDefinition:包含一个或多个流程定义的资源。部署器会拾取此资源。
- processImage:表示已部署流程定义图形布局的资源。
获取部署资源内容
GET repository/deployments/{deploymentId}/resourcedata/{resourceId}
获取部署资源内容 - URL 参数
| 参数 |
|---|