使用部署API在命令行里复制应用

cybozu发表于:2017年02月09日 18:18:44更新于:2019年01月31日 15:25:14

概要

2015年7月12日的更新,追加了获取和设置应用信息的各种API。2015/07/12定期维护中事前发布的kintone API更新的信息(暂时仅提供日文)里追加的API如下:

  • 更新记录的状态

  • 应用的作成和设置的变更

  • 运用环境里反映应用的设置

  • 获取应用的常规设置

  • 更改应用的常规设置

  • 获取表单的设置

  • 更改表单的设置

  • 获取列表的设置

  • 更改列表的设置

  • 获取应用的访问权限

  • 获取记录的访问权限

  • 获取字段的访问权限

  • JavaScript / CSS自定义设置的获取

  • JavaScript / CSS自定义设置的更改

这次,我们将使用命令行的HTTP客户端curl,将既存的应用复制到其他的kintone里。主要重点说明使用部署API复制应用的时候,容易陷入困境的地方。

准备

在命令行端使用curl。curl是Linux和MacOS X标准搭载的。Windows也可以使用cygwin之类的工具来使用curl。

curl

curl的基本使用方法

使用curl访问kintone的基本选项如下:

curl -X <方法> -H  <头信息> -d <参数>

事先定义共通的参数。在终端执行以下的命令。

$ BASE64=`echo -n 'user:password' | openssl base64`
$ AUTH="X-Cybozu-Authorization: ${BASE64}"
$ JSON="Content-Type: application/json"
$ HOST="https://subdomain.cybozu.com/k"

※user:password 和 subdomain的部分请按情况替换。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{id:160}'  ${HOST}/v1/app.json
{"appId":"160","code":"","createdAt":"2015-08-21T10:42:16.000Z","creator":{"code":"Ita","name":"ita"},"description":"记录每天的业务内容、报告事项、所感等的应用。\u003Cdiv\u003E不光是记录,之后的回顾和成员间的交流也可以使用。\u003C/div\u003E","modifiedAt":"2015-08-21T10:43:25.000Z","modifier":{"code":"Ita","name":"ita"},"name":"日报","spaceId":null,"threadId":null}

使用curl可以从kintone那获取信息! 使用BASIC认证的情形,请追加以下这样的BASIC认证用的头部。

$ BASIC="basic_user:basic_password"
$ curl -X GET --user "$BASIC" -H "$AUTH" -H "$JSON" -d '{id:160}'  ${HOST}/v1/app.json

使用API,复制这个日报的应用。

应用的作成

使用应用作成API(暂时仅提供日文)作成应用。

$ curl -X POST -H "$AUTH" -H "$JSON" -d '{name:"复制的应用"}'  ${HOST}/v1/preview/app.json
{"app":"162","revision":"2"}

应用ID: 162的应用作成了。因为还没配置到运用环境里,所以无法在首页显示,但是通过以下的URL可以访问管理页面。https://subdomain.cybozu.com/k/admin/app/flow?app=162

常规设置信息的复制

接下来首先,从复制源的应用那获取常规设置信息。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}'  ${HOST}/v1/preview/app/settings.json > settings.json

这边获取到的常规设置信息,将会被使用到新作成的应用里,但是无法直接使用刚才生成的json。需要添加app参数,并移除revision参数。

settings.json

{
    "description":"记录每天的业务内容、报告事项、所感的应用。\u003Cdiv\u003E不光是日报的记录,回顾和成员间的讨论也可以记录。\u003C/div\u003E",
    "icon":{
        "key":"APP15",
        "type":"PRESET"
    },
    "name":"日报",
    "revision":"7",
    "theme":"CLIPBOARD"
}

添加app参数,移除revision参数

{
    "app":162,
    "description":"记录每天的业务内容、报告事项、所感的应用。\u003Cdiv\u003E不光是日报的记录,回顾和成员间的讨论記也可以记录。\u003C/div\u003E",
    "icon":{
        "key":"APP15",
        "type":"PRESET"
    },
    "name":"日报",
    "theme":"CLIPBOARD"
}

修正后的json使用PUT方法来送信。curl可以在-d选项里添加@符号来指定文件。

$ curl -X PUT -H "$AUTH" -H "$JSON" -d '@settings.json' ${HOST}/v1/preview/app/settings.json
{"revision":"3"}

表单情报的复制

同样的,从复制源的应用那获取信息。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}' ${HOST}/v1/preview/app/form/fields.json > fields.json

这边获取到的数据,并不能直接送信。需要加上app/revision参数的处理,主要是因为有内置字段(built-in field)的问题。

内置字段(built-in field)是在作成应用时自动添加的,所以无法通过字段添加API来添加。因此这些字段即使是在新建应用的时候也需要使用变更API。

内置字段的列表

  • 记录编号(type:"RECORD_NUMBER")

  • 创建人(type:”CREATOR")

  • 创建时间(type”:”CREATED_TIME")

  • 更新人(type:”MODIFIER")

  • 更新日時(type:”UPDATED_TIME")

  • 状态(type:”STATUS")

  • 作業者(type:”STATUS_ASSIGNEE")

  • 类别(type:”CATEGORY")


※即便是设置了不使用类别和过程管理,内部还是添加了类别和创建人字段。

获取到的json分成内置字段和非内置字段。

builtin_fields.json

{
  "app": 162,
  "properties": {
    "更新时间": {
      "code": "更新时间",
      "label": "更新时间",
      "noLabel": false,
      "type": "UPDATED_TIME"
    },
    "创建人": {
      "code": "创建人",
      "label": "创建人",
      "noLabel": false,
      "type": "CREATOR"
    },
    "状态": {
      "code": "状态",
      "enabled": false,
      "label": "状态",
      "type": "STATUS"
    },
    "更新人": {
      "code": "更新人",
      "label": "更新人",
      "noLabel": false,
      "type": "MODIFIER"
    },
    "类别": {
      "code": "类别",
      "enabled": false,
      "label": "类别",
      "type": "CATEGORY"
    },
    "执行者": {
      "code": "执行者",
      "enabled": false,
      "label": "执行者",
      "type": "STATUS_ASSIGNEE"
    },
    "记录编号": {
      "code": "记录编号",
      "label": "记录编号",
      "noLabel": false,
      "type": "RECORD_NUMBER"
    },
    "创建时间": {
      "code": "创建时间",
      "label": "创建时间",
      "noLabel": false,
      "type": "CREATED_TIME"
    }
  }
}



fields.json

{
  "app": 162,
  "properties": {
    "日期": {
      "code": "日期",
      "defaultNowValue": true,
      "defaultValue": "",
      "label": "日期",
      "noLabel": false,
      "required": false,
      "type": "DATE",
      "unique": false
    },
    "多行文本框_": {
      "code": "多行文本框_",
      "defaultValue": "",
      "label": "业务内容",
      "noLabel": false,
      "required": false,
      "type": "MULTI_LINE_TEXT"
    },
    "多行文本框_0": {
      "code": "多行文本框_0",
      "defaultValue": "",
      "label": "所感、所学",
      "noLabel": false,
      "required": false,
      "type": "MULTI_LINE_TEXT"
    },
    "下拉菜单": {
      "code": "下拉菜单",
      "defaultValue": "",
      "label": "部门",
      "noLabel": false,
      "options": {
        "支持": {
          "index": "3",
          "label": "支持"
        },
        "营业": {
          "index": "0",
          "label": "营业"
        },
        "开发": {
          "index": "4",
          "label": "开发"
        },
        "总务": {
          "index": "2",
          "label": "总务"
        },
        "市场": {
          "index": "1",
          "label": "市场"
        }
      },
      "required": false,
      "type": "DROP_DOWN"
    },
    "添付文件": {
      "code": "添付文件",
      "label": "添付文件",
      "noLabel": false,
      "required": false,
      "thumbnailSize": "150",
      "type": "FILE"
    },
    "单选框": {
      "align": "HORIZONTAL",
      "code": "单选框",
      "defaultValue": "达成",
      "label": "目标达成度",
      "noLabel": false,
      "options": {
        "达成": {
          "index": "0",
          "label": "达成"
        },
        "未达成": {
          "index": "1",
          "label": "未达成"
        }
      },
      "required": true,
      "type": "RADIO_BUTTON"
    }
  }
}

内置字段使用PUT方法(更新),非内置字段使用POST方法(添加)来送信。
在作成1次以后,非内置字段也可以使用PUT方法来更新。

$ curl -X POST -H "$AUTH" -H "$JSON" -d '@fields.json' ${HOST}/v1/preview/app/form/fields.json
{“revision":"4"}
$ curl -X PUT -H "$AUTH" -H "$JSON" -d '@builtin_fields.json' ${HOST}/v1/preview/app/form/fields.json
{“revision":"5"}

Layout信息的复制

从原来的应用获得layout情报。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}'  ${HOST}/v1/preview/app/form/layout.json > layout.json

app的添加和revision的删除,使用PUT方法来送信。

$ curl -X PUT -H "$AUTH" -H "$JSON" -d '@layout.json' ${HOST}/v1/preview/app/form/layout.json
{“revision":"6"}

列表的复制

从原来的应用那获取列表信息。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{app:160}'  ${HOST}/v1/preview/app/views.json > views.json

views.json

{
  "revision": "7",
  "views": {
    "自己的日报(日历形式)": {
      "date": "日期",
      "filterCond": "创建人 in (LOGINUSER())",
      "id": "9265",
      "index": "1",
      "name": "自己的日报(日历形式)",
      "sort": "创建时间 desc",
      "title": "多行文本框",
      "type": "CALENDAR"
    },
    "日报列表": {
      "fields": ["日期", "创建人", "多行文本框", "多行文本框_0"],
      "filterCond": "",
      "id": "2128",
      "index": "0",
      "name": "日报列表",
      "sort": "创建时间 desc",
      "type": "LIST"
    }
  }
}


和之前一样,添加app,删除revision。

{
  "app":162,
  "views": {
    "自己的日报(日历形式)": {
      "date": "日期",
      "filterCond": "创建人 in (LOGINUSER())",
      "id": "9265",
      "index": "1",
      "name": "自己的日报(日历形式)",
      "sort": "创建时间 desc",
      "title": "多行文本框",
      "type": "CALENDAR"
    },
    "日报列表": {
      "fields": ["日期", "创建人", "多行文本框", "多行文本框_0"],
      "filterCond": "",
      "id": "2128",
      "index": "0",
      "name": "日报列表",
      "sort": "创建时间 desc",
      "type": "LIST"
    }
  }
}

PUT方法送信。

$  curl -X PUT -H "$AUTH" -H "$JSON" -d '@views.json' ${HOST}/v1/preview/app/views.json
{"revision":"7","views":{"自己的日报(日历形式)":{"id":"5259991"},"日报列表":{"id":"5259990"}}}

以下是复制列表需要注意的点:

  • 使用过程管理的情形,会生成builtinType=ASSIGNEE的列表,因为无法移行这个列表,因此需要从json里除外。

  • 当复制源里存在创建人作为筛选条件的列表时,复制目标里过程管理无效的话,就无法移行这个列表。

将应用放到运用环境里

最后,使用deploy.json,将应用放到运用环境里。

$  curl -X POST -H "$AUTH" -H "$JSON" -d '{apps:[{app:162}]}' ${HOST}/v1/preview/app/deploy.json

使用GET deploy.json,如果返回status:SUCCESS的话,就部署成功了。

$ curl -X GET -H "$AUTH" -H "$JSON" -d '{apps:[162]}' ${HOST}/v1/preview/app/deploy.json
{"apps":[{"app":"162","status":"SUCCESS"}]}

00158ae522695b9fd2f1feb9c71b722

大家觉得怎么样? 使用部署API的话,就可以移行JS和CSS自定义设置和访问权了。这次虽然是在同一个kintone里复制,事实上也可以移行到其他环境的kintone。到目前为止手动设置的应用就可以使用API来实现,可以大大减少运用维护的时间。