首页 > 解决方案 > 如何在 Orion Context Broker 注册到 Context Provider 时包含 fiware-service 和 fiware-servicePath 标头?

问题描述

我们正在研究使用本地 Docker 容器的 Orion Context Broker 技术,并尝试将本地 Context Broker 与外部 Context Provider 集成。

具体来说,我们正在尝试从这个 Context 提供程序中检索数据:

https://streams.lab.fiware.org/v2/entities?type=AirQualityObserved&options=keyValues

使用标题:

固件服务:环境

固件服务路径:/马德里

具体来说,我们的目标是实现从我们的 Context Broker 到提供者的这个节点的注册,以便获得一些我们在本地没有的属性(在该示例中,该属性称为“NO”)。

我们发送的注册请求如下:

curl -iX POST \
  'http://localhost:1026/v2/registrations' \
  -H 'Content-Type: application/json' \
  -d '{
  "description": "Air Quality Madrid",
  "dataProvided": {
    "entities": [
      {
        "id": "Madrid-AirQualityObserved-28079059-latest",
        "type": "AirQualityObserved"
      }
    ],
    "attrs": [
      "NO"
    ]
  },
  "provider": {
    "http": {
      "url": "https://streams.lab.fiware.org"
    }
  }
}'

此外,我们创建了一个本地实体,其 ID 与请求中的相同:Madrid-AirQualityObserved-28079059-latest

在获得这些信息之后,问题是:

是否可以在注册请求中包含特定的 fiware-service 和 fiware-servicePath 标头?包含它们的方法是什么?

提前致谢。

编辑:

我一直在使用以下命令进行更多测试:

要注册到上下文提供程序,请使用所需服务的特定标头。目前,本地实体不是在本地上下文代理中创建的。

curl -iX POST \
  'http://localhost:1026/v2/registrations' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: environment' \
  -H 'fiware-servicepath: /Madrid' \
  -d '{
  "description": "Air Quality Madrid",
  "dataProvided": {
    "entities": [
      {
        "id": "Madrid-AirQualityObserved-28079059-latest",
        "type": "AirQualityObserved"
      }
    ],
    "attrs": [
      "NO"
    ]
  },
  "provider": {
    "http": {
      "url": "https://streams.lab.fiware.org"
    }
  }
}'

然后,我检查了注册是否已正确注册:

curl -X GET http://localhost:1026/v2/registrations \
    -H 'fiware-service: environment'   
    -H 'fiware-servicepath: /Madrid'

最后,我尝试从提供者那里检索实体:

curl -X GET http://localhost:1026/v2/entities/Madrid-AirQualityObserved-28079059-latest \
  -H 'fiware-service: environment' \
  -H 'fiware-servicepath: /Madrid' 

但是响应表明该请求没有任何实体。因此,我在本地上下文代理中创建了实体,不包括我试图从提供者“NO”获取的字段。

curl -iX POST \
  'http://localhost:1026/v2/entities' \
  -H 'Content-Type: application/json' \
  -H 'fiware-service: environment' \
  -H 'fiware-servicepath: /Madrid' \
  -d '
{
    "id": "Madrid-AirQualityObserved-28079059-latest",
    "type": "AirQualityObserved"
}'

但是,如果我咨询 ID 为 Madrid-AirQualityObserved-28079059-latest 的实体,我将收到本地数据,并且未从提供商处检索到“NO”字段。那是响应(缺少 NO 字段):

{
    "id": "Madrid-AirQualityObserved-28079059-latest",
    "type": "AirQualityObserved"
}

我做错了什么?

标签: fiware-orion

解决方案


是的,这是可能的。

它们作为常规标题包含在内。例如,如果您使用 curl,它将类似于-H 'fiware-service: environment' -H 'fiware-servicepath: /Madrid'.

编辑:

查看您正在使用的查询请求:

curl -X GET http://localhost:1026/v2/entities/Madrid-AirQualityObserved-28079059-latest \
  -H 'fiware-service: environment' \
  -H 'fiware-servicepath: /Madrid' 

我看到查询中没有包含实体类型,这与上下文提供程序和请求转发文档中的建议相反:

在转发时,NGSIv2 更新/查询中的任何类型的实体都匹配没有实体类型的注册。但是,相反的方法不起作用,因此如果您注册了类型,那么您必须?type在 NGSIv2 更新/查询中使用才能获得匹配。否则,您可能会遇到问题,例如StackOverflow上的这篇文章中描述的问题。

所以也许你应该使用:

curl -X GET http://localhost:1026/v2/entities/Madrid-AirQualityObserved-28079059-latest?type=AirQualityObserved \
  -H 'fiware-service: environment' \
  -H 'fiware-servicepath: /Madrid' 

推荐阅读