Orion 上下文代理 - 订阅
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"
}
}
}
有什么建议请:) 谢谢。
问题的根本原因是 =
是禁止字符,出于安全原因不允许在负载请求中使用(请参阅 this section in the user manual)。
有两种可能的解决方法:
- 避免在 URL 中使用查询字符串以在 subscribeContext 中引用,例如使用
http://192.168.1.12:1028/accumulate/name/dupex
.
- 编码 URL encoding 以避免使用禁用字符(特别是
=
的代码是 %3D
)并准备解码它的代码。
在情况 2 中,您可以在 subscribeContext 中使用以下引用:http://192.168.1.12: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 Specification 中的 "Subscriptions" 和 "Custom Notifications" 部分。
我有个小问题。我正在订阅 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"
}
}
}
有什么建议请:) 谢谢。
问题的根本原因是 =
是禁止字符,出于安全原因不允许在负载请求中使用(请参阅 this section in the user manual)。
有两种可能的解决方法:
- 避免在 URL 中使用查询字符串以在 subscribeContext 中引用,例如使用
http://192.168.1.12:1028/accumulate/name/dupex
. - 编码 URL encoding 以避免使用禁用字符(特别是
=
的代码是%3D
)并准备解码它的代码。
在情况 2 中,您可以在 subscribeContext 中使用以下引用:http://192.168.1.12: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 Specification 中的 "Subscriptions" 和 "Custom Notifications" 部分。