Cordra服务启动后,使用https://127.0.0.1:8443可以访问它的UI操作界面,http://127.0.0.1:8080访问不需要登录,但功能不完整。
先来看一下UI界面的各个功能选项
#All Objects(所有对象)
#Show Only(按schema或特定type过滤显示)
#Admin(管理员功能)
对象的增删改查
点击create-document,填写name、description属性内容,并添加一个playload文件,点击save
回到列表页后可以看到多了一个数据对象了。点击新增的对象,进入详情页。点击edit可以更新或删除对象记录。其它tab页操作内容较简单,就不累述了。
- OBJECT 展示刚刚充填的内容
- ACL 可以设置该对象在对外开放时,需要的权限,包括可读者、可写者、主题信息可读者、接口返回
- VERSIONS 数据版本归档
- DO VIEW/DETAILS 对象json显示
- RELATIVES 引用的其它对象关系展示,标识符id设计时是可以引用其它对象的,后续篇章会详述
Types的增删改查
页面操作比较简单
- 可以通过访问https://localhost:8443/search?query=type:"Document“进行type的查询。
- 界面可以通过加载文件进行type新建,文件也可以是具体的一个对象数据
- 可以操作删除type并删除type结构下的所有对象数据
以下是新建type的一个JSON格式参数
{
"results": [
{
"id": "test/171a0606f7c74580fd39",
"type": "Schema",
"content": {
"identifier": "test/171a0606f7c74580fd39",
"name": "Group",
"schema": < Schema json omitted for brevity >,
"javascript": < JavaScript omitted for brevity >
},
"metadata": {
"createdOn": 1535479938849,
"createdBy": "admin",
"modifiedOn": 1535479938855,
"modifiedBy": "admin",
"txnId": 65
}
},
{
"id": "test/171a0606f7c74580fd39",
"type": "Schema",
"content": {
"identifier": "test/171a0606f7c74580fd39",
"name": "Document",
"schema": < Schema json omitted for brevity >
},
"metadata": {
"createdOn": 1535479938849,
"createdBy": "admin",
"modifiedOn": 1535479938855,
"modifiedBy": "admin",
"txnId": 65
}
},
]
}
JSON模式中的关键字和属性
- 模式引用-属性JSON类型定义
Cordra支持$ref关键字用于在模式中引用或在Cordra中引用其他模式。 下面的例子定义了一个叫Human的type结构。name和address属性必填,name是字符串类型;address是一个JSON对象,且必须包含street_address、city、state三个属性。JSON中的type值需要是基本类型,可选的基本类型有 array、boolean、integer、null、number、object、string。
Human类型定义
{
"type": "object",
"required": [ "name", "address" ],
"properties": {
"name": { "type": "string" },
"address": { "$ref": "#/definitions/address" }
},
"definitions": {
"address": {
"type": "object",
"properties": {
"street_address": { "type": "string" },
"city": { "type": "string" },
"state": { "type": "string" }
},
"required": [ "street_address", "city", "state" ]
}
}
}
使用definitions的方式说明address结构有一个好处是,该字段可以被其它的模式对象引用。如果不需要被引用,在properties里直接定义也是可以的,如:
{
"type": "object",
"required": [
"name",
"address"
],
"properties": {
"name": {
"type": "string"
},
"address": {
"type": "object",
"properties": {
"street_address": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
}
},
"required": [
"street_address",
"city",
"state"
]
}
}
}
类型定义后可以通过一下代码进行新建(当然通过UI或API直接传JSON参数也可以进行对象新建)。
description属性是代码附加的第三个属性。
CordraClient cordra = new TokenUsingHttpCordraClient("https://127.0.0.1:8443", "admin", "admin123");
CordraObject object = new CordraObject();
object.id="Human/001";
object.type="Human";
JsonObject json = new JsonObject();
json.addProperty("name", "Tony");
json.addProperty("description", "A hairdresser");
JsonObject definitionJson = new JsonObject();
definitionJson.addProperty("street_address", "No.1 Shen mei Road");
definitionJson.addProperty("city", "Shanghai");
definitionJson.addProperty("state", "China");
json.add("address", definitionJson);
object.content = json;
cordra.create(object);
再来看看Human/001的创建结果
- 模式引用-其它模式引用
还可以对其他Cordra模式进行引用。 默认情况下,模式名可以用作$ref的相对URI。 可以包含一个JSON指针。
默认情况下,每个模式都被认为有一个基URI为/cordra/schemas/
下面举例定义一个叫Member的类型结构
{
"type": "object",
"required": [
"name",
"address"
],
"properties": {
"name": {
"type": "string"
},
"address": {
"allOf": [
{
"properties": {
"kind": {
"type": "string",
"enum": [
"residential",
"business"
]
}
},
"required": [
"kind"
]
},
{
"$ref": "Person#/definitions/address"
}
]
}
}
}
引用的Person的类型定义:
{
"type": "object",
"required": [
"name",
"address"
],
"properties": {
"name": {
"type": "string"
},
"address": {
"$ref": "#/definitions/address"
}
},
"definitions": {
"address": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"residential",
"business"
]
}
},
"required": [
"kind"
]
}
}
}
java代码:
CordraClient cordra = new TokenUsingHttpCordraClient("https://127.0.0.1:8443", "admin", "admin123");
CordraObject person = new CordraObject();
person.id = "Person/001";
person.type = "Person";
JsonObject personJson = new JsonObject();
personJson.addProperty("name", "Kevin");
JsonObject personDefinitionJson = new JsonObject();
personDefinitionJson.addProperty("kind", "business");
personJson.add("address", personDefinitionJson);
person.content = personJson;
cordra.create(person);
CordraObject member = new CordraObject();
member.id = "Member/001";
member.type = "Member";
JsonObject memberJson = new JsonObject();
memberJson.addProperty("name", "Kevin");
memberJson.addProperty("description", "A hairdresser");
//根据Person类型的具体对象Id获取到对象,解析拿到其address结构信息后封装
CordraObject personCO = cordra.get("Person/001");
memberJson.add("address", personCO.getContent(JsonObject.class).get("address"));
member.content = memberJson;
cordra.create(member);
最后查看Person/001和Member/001的数据结果
- Cordra的$ref只支持JSON指针。 不支持普通名称
- Cordra不支持使用$id或id来识别子模式(被引用模式); id是在系统级别上对Cordra来说有意义
- Cordra UI一般不支持递归使用$ref。
- Format关键字
对象属性在UI的显示格式设置,数组类型array属性可以设置表格显示”format” : “table”;字符串可设置文本框显示”format” : “textarea”,或密码框显示”format” : “password”。下面以表格显示为例:
KeywordTestType类型定义
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "array",
"format": "table"
}
}
}
java代码:
CordraClient cordra = new TokenUsingHttpCordraClient("https://127.0.0.1:8443", "admin", "admin123");
CordraObject person = new CordraObject();
person.id = "KeywordTestType/001";
person.type = "KeywordTestType";
person.content = JsonParser.parseString("{\"name\":[\"Tony\",\"Kevin\",\"Allen\"]}");
cordra.create(person);
UI上查看结果:
- cordra关键字及下辖的模式特定属性关键字
属性可以设置一个以key值为cordra的JSON属性组,内置多个属性。
- indexPayloads(boolean),当payload文件比较大时,设置”indexPayloads”:false将文件不作为索引存储,可以保证整个服务的搜索性能。该属性在顶层显示,作用于type
- preview(JSON),前端显示参数组:
showInPreview(boolean):是否在查询结果或关系图中固定显示
isPrimary(boolean):设置为标题,和showInPreview组合使用
excludeTitle(boolean):不作为标题显示,和showInPreview组合使用
- type(JSON),结构配置组:
suggestedVocabulary(enum):提供一个枚举值列表供UI操作时选择,和前面碰到过的”enum”:[“residential”,”business”]不同的是,这个参数是非强制的
autoGeneratedField(String):自动填充值,可选值handle、createdOn(creationDate)、modifiedOn(modificationDate) 、createdBy、modifiedBy;设置后在UI端就无法编辑,handle即句柄id;当选择句柄进行填充时,还可以配置
type.autoGeneratedField.prepend(string,句柄前缀,以/符号结尾)、type.autoGeneratedField.prependHandleMintingConfigPrefix(boolean,预处理前缀)一起使用,以便在存储时如何设置该属性的标识。
handleReference.types(可引用的其它types列表,为空或不设置则没有限制)
type.handleReference.excludeTypes(与上一个属性互斥,除该types列表外的类型都可引用)
type.handleReference.name(UI中如关系图中用什么来命名这个关系线),example:{{../name}}标识用引用对象的name属性
type.handleReference.prepend(string,句柄前缀,以/符号结尾)
type.handleReference.prependHandleMintingConfigPrefix(boolean,自动带/符号)
下面是前面几个属性的举例定义
{
"type": "object",
"cordra": {
"indexPayloads": false
},
"required": [
"name",
"description",
"reference"
],
"properties": {
"id": {
"type": "string",
"cordra": {
"type": {
"autoGeneratedField": "handle"
}
}
},
"name": {
"type": "array",
"format": "table"
},
"description": {
"type": "string",
"cordra": {
"preview": {
"showInPreview": true,
"isPrimary": true
},
"type": {
"suggestedVocabulary": [
"Apple",
"Banana",
"Orange"
]
}
}
},
"reference": {
"title": "Reference",
"type": "string",
"cordra": {
"type": {
"handleReference": {
"types": [
"type1",
"type2",
"type3"
],
"name": "{{../name}}"
}
}
}
}
}
}
- auth(JSON):权限配置,type中设置了该类型属性后,创建出的数据对象将有系统账户功能
users引用的是用户列表
"users": {
"type": "array",
"format": "table",
"title": "Users",
"uniqueItems": true,
"items": {
"type": "string",
"title": "User",
"cordra": {
"type": {
"handleReference": {
"types": [ "user" ]
}
}
}
},
"cordra": {
"auth": "usersList"
}
}
指明字段类型:username用户名、password密码、requirePasswordChange是否在每次请求前更新密码、accountActive账号是否正常、publicKey公钥字段
"username": {
"type": "string",
"title": "Username",
"cordra": {
"auth": "username"
}
}
"password": {
"type": "string",
"format": "password",
"title": "Password",
"cordra": {
"auth": "password"
}
}
"requirePasswordChange": {
"type": "boolean",
"title": "Require Password Change",
"description": "If true a new password must be set on next authentication.",
"cordra": {
"auth": "requirePasswordChange"
}
}
"accountActive": {
"type": "boolean",
"title": "Account active",
"cordra": {
"auth": "accountActive"
}
}
- response.mediaType(返回信息类型)
还有其他一些属性可以在官网里自行查看使用方式"xmlschema": {
"type": "string",
"format": "textarea",
"title": "XML Schema",
"cordra": {
"response": {
"mediaType": "application/xml"
}
}
}
Design Object
服务策略配置,即希望cordra在哪种情况下运转,可配置的内容包括:ids生成规格、权限设置、前端显示规格配置、handle配置、doip配置、javascript配置、旧接口使用策略配置等。可根据业务需求或个人喜好进行这些策略规格的配置。后续篇章会着重说明下handle配置和doip配置