我正在对作为 freeboard 插件的现有 js 代码进行一些更改。问题是我不确定如何访问收到的 json 有效负载。
插件应该与之通信的 api 的实现已从 not-so-RESTfull 更改为类似 RESTfull。并且有困难。
原始 jscript 插件包含此代码,我认为这部分是我在此处描述的问题的罪魁祸首。
$.ajax({
url : url,
dataType : "JSON",
type: "POST",
data: '{"entities":[{"type": "'+currentSettings.type+'","isPattern": false, "id" :"'+currentSettings.id+'"}]}',
beforeSend: function(xhr)
{
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Fiware-Service", currentSettings.service);
xhr.setRequestHeader("Fiware-ServicePath", currentSettings.servicepath);
xhr.setRequestHeader("X-Auth-Token", currentSettings.xauthtoken);
},
带有以下类型的网址:
127.0.0.1:1026/v1/queryContext
整个 js 部分应该模仿来自 Orion Context Broker API v1 的示例中的查询,看起来像这样。
链接到 Orion Context Broker API v1 中的查询操作
正如您所看到的,它并不是真正的 RESTfull,它已被更改,但是插件已在 3 年前更新,并且不适用于新方法。
在新版本的 API 实现中,我可以简单地通过以下方式查询资源
curl localhost:1026/v2/entities/Room1?type=Room -s -S -H 'Accept: application/json' | python -mjson.tool
我更改了插件代码的那部分,主要是 URL 的定义,我想(但无法真正检查它 - 是否有任何 js 编译器或测试它的东西?我尝试了 Naked for python 并通过节点运行它,但没有调试它的方式)它应该可以工作。
$.ajax({
url : url,
type: "GET",
beforeSend: function(xhr)
{
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Fiware-Service", currentSettings.service);
xhr.setRequestHeader("Fiware-ServicePath", currentSettings.servicepath);
xhr.setRequestHeader("X-Auth-Token", currentSettings.xauthtoken);
},
我有一个连接和使用我提供代码的 url 的服务,它通过 Insomnia 进行了测试。如果此代码没有错误,那么他真正的问题在于原始代码的以下部分:
//Get attributes
attributes=data["contextResponses"][0]["contextElement"]["attributes"];
它从接收到的有效负载中获取属性以进行进一步操作。在 v1 api 中接收到的有效载荷如下所示:
现在它看起来像这样:
或者,如果我使用这样的 keyValues 选项:
其中 id 用于请求的 url 和 type 也可以,这是已知的,所以它们无关紧要。最重要的是id和type后面的那些属性。
我如何提取它们?
原始代码的成功部分,包含提到的 getAttributes 方法:
该插件的代码在此问题的第一段中提到。
success : function(data)
{
//Initialize mydata
mydata={};
//if advanced setting is true do not modify received JSON
if(currentSettings.advanced){
mydata=data;
}
//if advanced setting is false reduce received JSON nesting
else{
//Get attributes
attributes=data["contextResponses"][0]["contextElement"]["attributes"];
//Get each attribute and append it to mydata
//////////////////////////////////////////////
Then there is manipulation on received data that is
similar in both cases