按照EDC/Samples/Transfer/Transfer1/README 的 步骤进行操作。
- 创建提供商资产(要共享的数据)
- 在提供商处创建访问策略
- 在提供商中创建合同定义
- 然后,消费者发送合同谈判
一、以下在provider端操作
1、注册资产
在provider中创建一个资产。
bash
curl -d @transfer/transfer-01-negotiation/resources/create-asset.json \
-H 'content-type: application/json' http://localhost:19193/management/v3/assets \
-s jq
该文件是使用curl 命令的 -data 选项传递的。内容如下。
scss
{
"@context": {
"@vocab": "https://w3id.org/edc/v0.0.1/ns/"
},
"@id": "assetId",
"properties": {
"name": "product description",
"contenttype": "application/json"
},
"dataAddress": {
"type": "HttpData",
"name": "Test asset",
"baseUrl": "https://jsonplaceholder.typicode.com/users",
"proxyPath": "true"
}
}
2、策略定义。
在provider中注册访问策略。
bash
curl -d @transfer/transfer-01-negotiation/resources/create-policy.json \
-H 'content-type: application/json' http://localhost:19193/management/v3/policydefinitions \
-s jq
传递的文件内容如下:
less
{
"@context": {
"@vocab": "https://w3id.org/edc/v0.0.1/ns/",
"odrl": "http://www.w3.org/ns/odrl/2/"
},
"@id": "aPolicy",
"policy": {
"@context": "http://www.w3.org/ns/odrl.jsonld",
"@type": "Set",
"permission": [],
"prohibition": [],
"obligation": []
}
}
该政策似乎是空的。顺便说一下,响应如下所示:
scss
{
"@type": "IdResponse",
"@id": "aPolicy",
"createdAt": 1724662296875,
"@context": {
"@vocab": "https://w3id.org/edc/v0.0.1/ns/",
"edc": "https://w3id.org/edc/v0.0.1/ns/",
"odrl": "http://www.w3.org/ns/odrl/2/"
}
}
3、创建合同定义。
在provider中创建合同定义。
bash
curl -d @transfer/transfer-01-negotiation/resources/create-contract-definition.json \
-H 'content-type: application/json' http://localhost:19193/management/v3/contractdefinitions \
-s jq
传递的文件内容如下:
less
{
"@context": {
"@vocab": "https://w3id.org/edc/v0.0.1/ns/"
},
"@id": "1",
"accessPolicyId": "aPolicy",
"contractPolicyId": "aPolicy",
"assetsSelector": []
}
二、以下在consumer端操作
从消费者处获取目录信息。
arduino
curl -X POST "http://localhost:29193/management/v3/catalog/request" \
-H 'Content-Type: application/json' \
-d @transfer/transfer-01-negotiation/resources/fetch-catalog.json -s jq
您获得的目录。以下获取的数据与官方样例数据不一致、此处获得的是HttpData-PUL。 参考以下返回数据,它是在 DCAT 中定义的。标明了ODRL中定义的策略的ID等,还包括通过HttpData进行数据共享的信息和服务信息。
以下代码中"@id": "MQ==:YXNzZXRJZA==:Y2ZmODc1NmYtYTRjMC00NzMxLWJlNTItM2M2ZTVlMGI2YzA3",再后续代码中会用到
scss
{
"@id": "4ce1bc3d-ce1e-4308-b03e-b6596958a69d",
"@type": "dcat:Catalog",
"dcat:dataset": {
"@id": "assetId",
"@type": "dcat:Dataset",
"odrl:hasPolicy": {
"@id": "MQ==:YXNzZXRJZA==:Y2ZmODc1NmYtYTRjMC00NzMxLWJlNTItM2M2ZTVlMGI2YzA3",
"@type": "odrl:Offer",
"odrl:permission": [],
"odrl:prohibition": [],
"odrl:obligation": []
},
"dcat:distribution": [
{
"@type": "dcat:Distribution",
"dct:format": {
"@id": "HttpData-PULL"
},
"dcat:accessService": {
"@id": "bb73ab52-bd72-448d-9629-8a21624b0577",
"@type": "dcat:DataService",
"dcat:endpointDescription": "dspace:connector",
"dcat:endpointUrl": "http://localhost:19194/protocol",
"dct:terms": "dspace:connector",
"dct:endpointUrl": "http://localhost:19194/protocol"
}
},
{
"@type": "dcat:Distribution",
"dct:format": {
"@id": "HttpData-PUSH"
},
"dcat:accessService": {
"@id": "bb73ab52-bd72-448d-9629-8a21624b0577",
"@type": "dcat:DataService",
"dcat:endpointDescription": "dspace:connector",
"dcat:endpointUrl": "http://localhost:19194/protocol",
"dct:terms": "dspace:connector",
"dct:endpointUrl": "http://localhost:19194/protocol"
}
}
],
"name": "product description",
"id": "assetId",
"contenttype": "application/json"
},
"dcat:distribution": [],
"dcat:service": {
"@id": "bb73ab52-bd72-448d-9629-8a21624b0577",
"@type": "dcat:DataService",
"dcat:endpointDescription": "dspace:connector",
"dcat:endpointUrl": "http://localhost:19194/protocol",
"dct:terms": "dspace:connector",
"dct:endpointUrl": "http://localhost:19194/protocol"
},
"dspace:participantId": "provider",
"participantId": "provider",
"@context": {
"@vocab": "https://w3id.org/edc/v0.0.1/ns/",
"edc": "https://w3id.org/edc/v0.0.1/ns/",
"dcat": "http://www.w3.org/ns/dcat#",
"dct": "http://purl.org/dc/terms/",
"odrl": "http://www.w3.org/ns/odrl/2/",
"dspace": "https://w3id.org/dspace/v0.8/"
}
}
消费者与提供商之间开始进行合同谈判。
总体流程如下。
- 消费者发送合同要约。
- 提供商根据自己的报价来验证收到的报价。
- 提供商发送同意或拒绝的消息。
- 如果验证成功,则保存协议。
谈判合同
为了请求任何数据,需要协商合同,并且提供商和消费者之间必须协商达成协议。
消费者现在需要与提供商启动合同谈判序列。该序列如下所示:
- 消费者向提供商发送合同要约(目前,这必须与提供商的要约相同! )
- 提供商根据自己的报价验证收到的报价
- 根据验证结果,提供商可以发送同意或拒绝
- 如果验证成功,提供商和消费者将存储收到的协议以供日后参考
当然,这是最简单的谈判顺序。稍后,除了确认或拒绝报价外,两个连接器还可以发送反报价。
请将文件negotiate-contract.json
中的{{contract-offer-id}}
中的占位符替为您在路径目录中找到的合同报价 ID dcat:dataset.odrl:hasPolicy.@id
。 将{{contract-offer-id}}替换为MQ==:YXNzZXRJZA==:Y2ZmODc1NmYtYTRjMC00NzMxLWJlNTItM2M2ZTVlMGI2YzA3
执行命令
bash
curl -d @transfer/transfer-01-negotiation/resources/negotiate-contract.json \
-X POST -H 'content-type: application/json' http://localhost:29193/management/v3/contractnegotiations \
-s jq
示例输出:
perl
{
...
"@id": "254015f3-5f1e-4a59-9ad9-bf0e42d4819e",
"createdAt": 1685525281848,
...
}
获取合同协议编号
调用端点启动合同协商后,我们会得到一个 UUID 作为响应。此 UUID 是消费者和提供商之间正在进行的合同协商的 ID。提供商和消费者之间的协商序列由状态机在后台异步执行。一旦提供商和消费者都达到confirmed
或 declined
状态,协商就完成了。现在,我们可以使用 UUID 通过消费者端的端点检查协商的当前状态。 以下的{{contract-negotiation-id}}替换为 254015f3-5f1e-4a59-9ad9-bf0e42d4819e
执行命令
css
curl -X GET "http://localhost:29193/management/v3/contractnegotiations/{{contract-negotiation-id}}" \
--header 'Content-Type: application/json' \
-s jq
如下图所示,可以看到已经Finalized了。:
scss
{
"@type": "ContractNegotiation",
"@id": "5ca21b82-075b-4682-add8-c26c9a2ced67",
"type": "CONSUMER",
"protocol": "dataspace-protocol-http",
"state": "FINALIZED",
"counterPartyAddress": "http://localhost:19194/protocol",
"callbackAddresses": [],
"contractAgreementId": "0b3150be-feaf-43bc-91e1-90f050de28bd", <---------
"@context": {
"@vocab": "https://w3id.org/edc/v0.0.1/ns/",
"dct": "https://purl.org/dc/terms/",
"dcat": "https://www.w3.org/ns/dcat/",
"odrl": "http://www.w3.org/ns/odrl/2/",
"dspace": "https://w3id.org/dspace/v0.8/"
}
}
至此,合约协商已成功完成。连接器现在已准备好进入数据传输阶段。记下contractAgreementId
。您将在下一章中需要它。