宜搭 Open API (旧)
目前,宜搭已经将 OpenAPI 全部上架到了钉钉开放平台, 但是仍然会保留宜搭OpenAPI调用(旧) (后续会逐步移除epaas宜搭OpenAPI说明文档,注意: 仅仅是移除说明文档)。通过钉钉开放平台调用宜搭 OpenAPI 是更好的选择。
当前文档是 epaas 宜搭 OpenAPI,不再建议通过 epaas 访问宜搭 OpenAPI。
通过钉钉开放平台调用宜搭 OpenAPI 请参考 宜搭Open API开放接口
手把手教程:
1. 准备工作
第一步:申请秘钥授权
目前宜搭已接入钉钉开放平台,优先走 钉钉开放平台接口,无需申请秘钥授权。如因钉钉平台无法调用或其他特别原因,可以钉钉联系技术支持-康健(钉钉号:kangjianoops)给予帮助和指引。
第二步:参考案例完成请求调用
demo 参考:下载样例项目 📎call-yidaapi-demo.7z 获取的应用 accessKey 和 secretKey 填入gateway.properties 配置文件中。样例项目是独立的 Spring boot 项目,用户根据需求做取舍。
1.1 Java调用方式
(1)引入依赖
手动JAR包依赖
📎xxpt.gateway.shared.client.zip
其他依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
说明:
上述需要引入的 maven 配置是网关调用的依赖项,如果和您本地的 jar 包版本冲突,请进行排包处理
(2)参数配置
例自定义配置文件:aecpgateway.properties
xxpt.gateway.protocal=https
xxpt.gateway.domainName=s-api.alibaba-inc.com
xxpt.gateway.accessKey=自己的 accessKey
xxpt.gateway.secretKey=自己的 secretKey
通过 XML 定义 bean
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/util http://localhost:8080/schema/www.springframework.org/schema/util/spring-util-2.0.xsd "default-autowire="byName">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:aecpgateway.properties</value>
</list>
</property>
</bean>
<bean id="executableClient" class="com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient" factory-method="getInstance" init-method="init" destroy-method="destroy">
<property name="protocal" value="${xxpt.gateway.protocal}"/>
<property name="domainName" value="${xxpt.gateway.domainName}"/>
<property name="accessKey" value="${xxpt.gateway.accessKey}"/>
<property name="secretKey" value="${xxpt.gateway.secretKey}"/>
</bean>
</beans>
出于安全性考虑,上文中的 ${accessKey} 和 ${secretKey} 请联系宜搭开发人员获取。
说明:
- 上述需要配置的 XML 需要自行通过 spring 进行加载,文件名没有要求,sdk 中不会自动加载
- 配置 bean 后,通过 ExecutableClient.getInstance() 获取的对象是单例,请知晓
- 如果项目框架不是 spring,可以自行通过 new ExecutableClient() 的方式创建对象,对象有设置上述属性的set 方法,属性设置完成后,请务必调用该对象的 init 方法初始化对象内部的其他属性
(3)调用示例
简单的单元测试:
@Test
public void postYidaOutTest() {
String api = "/yida_vpc/form/searchFormDatas.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_XXX");
postClient.addParameter("systemToken", "XXX");
postClient.addParameter("formUuid", "XXX");
postClient.addParameter("userId", "yida_pub_account");
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
工程中实际使用:
import com.alibaba.fastjson.JSON;
import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
import com.alibaba.xxpt.gateway.shared.client.http.PostClient;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.Map;
/*
* aecp网关服务请求工具
* @Author: weimeng(shanyu)
* @Date: 2019/2/28 下午2:50
*/
public class AecpGatewayRequestUtil {
/**
* 请求aecp网关
* @param param 请求参数
* @param url 网关地址, 在aecp网关服务(https://epaas.alibaba-inc.com)查看
* @return 请求结果
*/
public static AecpGatewayResult baseRequest(Map<String, String> param, String url) {
try {
PostClient postClient = ExecutableClient.getInstance().newPostClient(url);
if (!CollectionUtils.isEmpty(param)) {
for (Map.Entry<String, String> entry : param.entrySet()) {
postClient.addParameter(entry.getKey(), entry.getValue());
}
}
String result = postClient.post();
return JSON.parseObject(result, AecpGatewayResult.class);
}catch(Throwable e){
AecpGatewayResult result= new AecpGatewayResult();
result.setSuccess(false);
result.setResult("false");
return result;
}
}
}
/**
* aecp网关服务请求的返回结果类
* @Author: weimeng(shanyu)
* @Date: 2019/2/28 下午2:52
*/
public class AecpGatewayResult {
private boolean success;
private String content;
private String result;
private String errorCode;
private String errorMsg;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getResult() {
if (result == null) {
return content;
} else {
return result;
}
}
public void setResult(String result) {
this.result = result;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public String getContent() {
if (content == null) {
return result;
} else {
return content;
}
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "AecpGatewayResult{" +
"success=" + success +
", result='" + getResult() + ''' +
", errorCode='" + errorCode + ''' +
", errorMsg='" + errorMsg + ''' +
'}';
}
}
/**
* 获取授权用户账号列表
*/
public static final String GET_USER_LIST = "/yida_vpc/corp/getAliyunAuthInfo.json";
try {
Map<String, String> param = new HashMap<String, String>();
param.put(AecpHsfConstants.CURRENT_PAGE, request.getCurrentPage()+"");
param.put(AecpHsfConstants.PAGE_SIZE, request.getPageSize()+"");
param.put(AecpHsfConstants.ACCOUNT_NAME, request.getAccountName());
// 调用注册在aecp网关服务上的宜搭接口
AecpGatewayResult result = AecpGatewayRequestUtil.baseRequest(param, GET_USER_LIST);
// 请求成功
if(result.isSuccess()){
// 解析数据,用户列表
response = JSON.parseObject(result.getResult(), ConsoleUserListResponse.class);
if(response.getEmployee() != null && response.getEmployee().getTotalCount() != null){
response.setTotal(response.getEmployee().getTotalCount().longValue());
}
return response;
}
} catch (Exception e) {
// TODO
}
2. 表单接口
2.1 新增表单实例
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hexxxx | 在应用数据中获取。 |
userId | 钉钉的userId | 是 | ||
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-NJYJZELV8YZRDEI2N5IQ7L6VEDMR1VE9GMPCJB | |
formDataJson | 表单数据 | 是 | {"textField_jcpm6agt": "单行","employeeField_jcos0sar": ["workno"]} | 参考:附录1保存/更新 表单数据格式说明 |
- 返回值:
- success: 请求是否成功
- result:实例 ID
- errorMsg: 错误信息
- errorCode:错误码
- 返回值demo:{"result":"FINST-EF6Y93URN2UZ1SBPLIP9NAV6HR2GEO1Z4ZCHSCJ0","success":true}
2.2 更新表单中指定组件值
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | helxxx | 在应用数据中获取。 |
userId | 钉钉的userId | 是 | ||
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formInstId | 要更新的表单数据ID | 是 | 33f6d221-17f8-42b7-836a-682b95a046c2 | |
useLatestVersion | 使用最新的表单版本进行更新 | 否 | false | 默认为false |
updateFormDataJson | 要更新的表单组件值,必填 | 是 | {"employeeField_jcpm5gy2": ["workno"]} | 参考:附录1保存/更新 表单数据格式说明。 参数有的组件更新,没有的组件保持不变。 明细的值只能统一更新,无法只更新明细下某个组件的值 |
- 返回值:
- success: 请求是否成功
- errorMsg: 错误信息
- errorCode:错误码
- 返回值 demo:{"success":true}
2.3 删除表单实例
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | helxxx | 在应用数据中获取。 |
userId | 钉钉的userId | 是 | ||
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formInstId | 要删除的表单数据ID | 是 | 33f6d221-17f8-42b7-836a-682b95a046c2 |
- 返回值:
- success: 请求是否成功
- errorMsg: 错误信息
- errorCode:错误码
- 返回值 demo:{"success":true}
2.4 根据表单 ID 查询实例详情
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | helxx | 在应用数据中获取。 |
userId | 钉钉的userId | 是 | ||
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formInstId | 要查询的实例的实例ID | 是 | 33f6d221-17f8-42b7-836a-682b95a046c2 |
- 返回值
- success:请求是否成功
- errorMsg: 错误信息
- errorCode:错误码
- result:单据实例详情。参见附录5. 单据实例详情对象格式说明
2.5 根据条件搜索表单实例 ID 列表
- 接口:/yida_vpc/form/searchFormDataIds.json
- 说明:只有应用管理员才能使用这个接口
- 参数:
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hexxx | 在应用数据中获取。 |
userId | 钉钉的userId | 是 | ||
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | |
searchFieldJson | 根据表单内组件值查询 | 否 | 格式见附录2:根据组件值进行条件搜索,组件值格式说明 | |
currentPage | 当前页 | 否 | 1 | 必须大于0 默认1 |
pageSize | 每页记录数 | 否 | 10 | 必须大于0 默认10 不能大于100 |
originatorId | 根据数据提交人工号查询 | 否 | ||
createFrom | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表 | 否 | 2018-01-01 | 字符串格式,且为yyyy-MM-DD格式 |
createTo | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表。 | 否 | 2018-02-01 | 字符串格式,且为yyyy-MM-DD格式。 和createFrom一起,相当于查询在 2018-01-01到2018-01-31之间(包含01和31号)创建的数据。 |
modifiedFrom | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表 | 否 | 2018-01-01 | 字符串格式,且为yyyy-MM-DD格式 |
modifiedTo | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表。 | 否 | 2018-02-01 | 字符串格式,且为yyyy-MM-DD格式。 和modifiedFrom一起,相当于查询在 2018-01-01到2018-01-31之间(包含01和31号)被修改的数据。 |
- 返回值
- success : 请求是否成功;
- errorCode : 错误码;
- errorMsg : 错误信息;
- result :
- currentPage : 当前页
- totalCount : 符合条件的实例总数
- data : 实例ID列表
- 返回值 demo:{"result":{"data":["FINST-EF6Y93URN2F02S745LTMW2D2G4WVDS16O17ISCJ0"],"totalCount":1,"currentPage":1},"success":true}
2.6 根据条件搜索表单实例详情列表
- 接口:/yida_vpc/form/searchFormDatas.json
- 说明:只有应用管理员才能使用这个接口
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hellxxx | 在应用数据中获取。 |
userId | 钉钉的userId | 是 | ||
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | |
searchFieldJson | 根据表单内组件值查询 | 否 | 格式见附录2:根据组件值进行条件搜索,组件值格式说明 | |
currentPage | 当前页 | 否 | 1 | 必须大于0,默认1 |
pageSize | 每页记录数 | 否 | 10 | 必须大于0 默认10 不能大于100 |
originatorId | 根据数据提交人工号查询 | 否 | ||
createFrom | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表 | 否 | 2018-01-01 | 字符串格式,且为yyyy-MM-DD格式 (或者精确到秒 yyyy-MM-DD HH:mm:ss) |
createTo | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表。 | 否 | 2018-02-01 | 字符串格式,且为yyyy-MM-DD格式(或者精确到秒 yyyy-MM-DD HH:mm:ss) 和createFrom一起,相当于查询在 2018-01-01到2018-01-31之间(包含01和31号)创建的数据。 |
modifiedFrom | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表 | 否 | 2018-01-01 | 字符串格式,且为yyyy-MM-DD格式(或者精确到秒 yyyy-MM-DD HH:mm:ss) |
modifiedTo | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表。 | 否 | 2018-02-01 | 字符串格式,且为yyyy-MM-DD格式。 (或者精确到秒 yyyy-MM-DD HH:mm:ss)和modifiedFrom一起,相当于查询在 2018-01-01到2018-01-31之间(包含01和31号)被修改的数据。 |
dynamicOrder | 指定排序字段 | 否 | {"numberField_1ac":"+"} | 表示按照字段numberField_1ac升序排列 |
解决方案:如何使用上表中dynamicOrder
参数实现对一个或多个字段进行自定义排序?以JAVA为例,详见下方代码。
Map dynamicOrdern = new HashMap();
dynamicOrdern.put("textField_ky1av3w7","+");
SearchFormDatasRequest searchFormDatasRequest = new SearchFormDatasRequest()
.setDynamicOrder(JSON.toJSONString(dynamicOrdern));
- 返回值
- success : 请求是否成功;
- errorCode : 错误码;
- errorMsg : 错误信息;
- result :
- currentPage : 当前页
- totalCount : 符合条件的实例总数
- data : 实例详情列表。每个实例详情格式参见 附录 4 作为返回值的表单数据的格式说明
2.7 获取表单定义
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hexxxx | 在应用数据中获取。 |
userId | 钉钉的userId | 是 | ||
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-NJYJZELV8YZRDEI2N5IQ7L6VEDMR1VE9GMPCJB | |
version | 表单版本 | 否 | 1 | 可以传入formData中的version字段。 为空时返回最新的版本定义 |
- 返回值:
- success: 请求是否成功
- result:[]
- errorMsg: 错误信息
- errorCode:错误码
- 返回格式
{
"success":true,
"content":[
{
"label":"{"en_US":"CheckBox Field","zh_CN":"多选","type":"i18n"}",
"key":"checkboxField_jiwvhkdi"
},
{
"label":"{"en_US":"Textarea Field","zh_CN":"多行输入框","type":"i18n"}",
"key":"textareaField_jiwvhkdh"
},
{
"label":"{"en_US":"Select Field","zh_CN":"下拉单选","type":"i18n"}",
"key":"selectField_jiwvhkdg"
}
]
}
2.8 获取子表单数据
参数名 | 描述 | 是否必填 | 示例 | 备注 |
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | |
formInstanceId |