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配置
