繁体   English   中英

Orion Context Broker-订阅

[英]Orion Context Broker - subscriptions

我有一个小问题。 我正在订阅Orion Context Broker,并且回调URL出现了一个奇怪的问题:此代码可从教程中获取:

{
   "entities": [
        {
            "type": "Room",
            "isPattern": "false",
            "id": "Room1"
        }
    ],
    "attributes": [
        "temperature"
    ],
    "reference": "http://localhost:1028/accumulate",
    "duration": "P1M",
    "notifyConditions": [
        {
            "type": "ONTIMEINTERVAL",
            "condValues": [
                "PT10S"
            ]
        }
    ]
}

但是此代码不起作用:

{
    "entities": [
        {
            "type": "Room",
            "isPattern": "false",
            "id": "Room1"
        }
    ],
    "attributes": [
        "temperature"
    ],
    "reference": "http://192.168.1.12:1028/accumulate?name=dupex",
    "duration": "P1M",
    "notifyConditions": [
        {
            "type": "ONTIMEINTERVAL",
            "condValues": [
                "PT10S"
            ]
        }
    ]
}

唯一的不同是引用字段:“ reference”:“ 192.168.1.12:1028/accumulate?name=dupex”

我有:

{
    "subscribeError": {
        "errorCode": {
            "code": "400",
            "reasonPhrase": "Bad Request",
            "details": "Illegal value for JSON field"
        }
    }
}

任何建议,请:)谢谢。

问题的根本原因是=是禁止的字符,出于安全原因,在有效负载请求中不允许使用= (有关此信息,请参见本节 )。

有两种可能的解决方法:

  1. 避免在URL中使用查询字符串以供subscribeContext中引用,例如,使用http://192.168.1.12:1028/accumulate/name/dupex
  2. URL编码进行编码,以避免出现禁止的字符(特别是=的代码为%3D ),并准备将其解码的代码。

在情况2中,您可以在subscriptionContext中使用以下参考: http://192.168.1.12:1028/accumulate?name%3Ddupex : http://192.168.1.12:1028/accumulate?name%3Ddupex :1028/accumulate?name%3Ddupex。 然后,以下示例将考虑编码并正确获取name参数的代码示例(使用Flask作为REST服务器框架在Python中编写):

from flask import Flask, request
from urllib import unquote
from urlparse import urlparse, parse_qs
app = Flask(__name__)

@app.route("/accumulate")
def test():
    s = unquote(request.full_path) # /accumulate?name%3Dduplex -> /accumulate?name=duplex
    p = urlparse(s)                # extract the query part: '?name=duplex'
    d = parse_qs(p.query)          # stores the query part in a Python dictionary for easy access
    name= d['name'][0]             # name <- 'duplex'
    # Do whatever you need with the name...
    return ""

if __name__ == "__main__":
    app.run()

我猜想其他语言(Java,Node等)也可以使用类似的方法。

编辑 :Orion 1.2版支持NGSIv2中的通知自定义,允许这种使用情况。 例如,您可以定义以下订阅:

{
  ..
  "notification": {
    "httpCustom": {
      "url": "http://192.168.1.12:1028/accumulate",
      "qs": {
        "name": "dupex"
      }
    }
    ..
  }
  ..
}

有关详细信息,请查看NGSIv2规范中的 “订阅”和“自定义通知”部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM