简体   繁体   中英

FIWARE [NGSI] Orion-Cygnus-Hadoop HTTPBadRequestException: 'fiware-servicepath' through an Orion subscription

I want to persist some historical data from my server. So the documentation says that you must first send a subscription to Orion and then Orion will send the notification to Cygnus.

I made the subscription like this:

Entity payload = Entity.json("{\r\n" + 
                "   \"entities\": [{\r\n" + 
                "       \"type\": \"Usuario\",\r\n" + 
                "       \"isPattern\": \"true\",\r\n" + 
                "       \"id\": \"Usuario*\"\r\n" + 
                "   }],\r\n" + 
                "   \"attributes\": [],\r\n" + 
                "   \"reference\": \"http://192.168.10.3:5050/notify\",\r\n" + 
                "   \"duration\": \"P4Y\",\r\n" + 
                "   \"notifyConditions\": [{\r\n" + 
                "       \"type\": \"ONCHANGE\",\r\n" + 
                "       \"condValues\": [\r\n" + 
                "           \"speed\"\r\n" + 
                "       ]\r\n" + 
                "   }],\r\n" + 
                "   \"throttling\": \"PT0.001S\"\r\n" + 
                "}");
        Response response = client.target("http://192.168.10.3:1026/v1/subscribeContext")
                .request(MediaType.APPLICATION_JSON_TYPE)
                .post(payload);

And the creation of entities:

Entity payload = Entity.json("{  \"type\": \"Usuario\",  \"id\": \"Usuario22\",  \"temperature\": {    \"value\": \"80.0\"  },  \"location\": {    \"value\": \""+latitud+", "+altitud+"\", \"type\": \"geo:point\",    \"metadata\": {      \"crs\": {        \"value\": \"WGS84\"      }    }  }}");
Response response = client.target("http://192.168.10.3:1026/v2/entities")
                .request(MediaType.APPLICATION_JSON_TYPE)
                .post(payload);

Then, Cygnus log tell me:

HTTPBadRequestException: 'fiware-servicepath' header value does not match the number of notified context responses [...]

Do any of you know why this is happening? The creation of the headers should be done by Orion or, failing that, by using the configuration of the Cygnus...

Thank you in advance.

UPDATE:

I have changed the http client of the server to make it easier to incorporate headers.

My subscription:

CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://192.168.10.3:1026/v1/subscribeContext");

        String json = "{\r\n" + 
                "   \"entities\": [{\r\n" + 
                "       \"type\": \"cargador\",\r\n" + 
                "       \"isPattern\": \"true\",\r\n" + 
                "       \"id\": \"cargador*\"\r\n" + 
                "   }],\r\n" + 
                "   \"attributes\": [\"speed\"],\r\n" + 
                "   \"reference\": \"http://192.168.10.3:5050/notify\",\r\n" + 
                "   \"duration\": \"P4Y\",\r\n" + 
                "   \"notifyConditions\": [{\r\n" + 
                "       \"type\": \"ONCHANGE\",\r\n" + 
                "       \"condValues\": [\r\n" + 
                "           \"speed\"\r\n" + 
                "       ]\r\n" + 
                "   }],\r\n" + 
                "   \"throttling\": \"PT0.001S\"\r\n" + 
                "}";
        StringEntity entity;
        try {
            entity = new StringEntity(json);
            httpPost.setEntity(entity);
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
            httpPost.setHeader("fiware-servicepath", "/");
            CloseableHttpResponse response;
                response = client.execute(httpPost);
            System.out.println(response.getStatusLine());
            client.close();

        } catch (UnsupportedEncodingException e1) {

My update context:

CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build()).build();
        HttpPost httpPost = new HttpPost("http://192.168.10.3:1026/v1/updateContext");

        String json = "{\r\n" + 
                " \"contextElements\": \r\n" + 
                "\r\n" + 
                "                   \r\n" + 
                "\r\n" + 
                "                       [\r\n" + 
                "   {\r\n" + 
                "     \"type\": \"cargador\",\r\n" + 
                "     \"isPattern\": \"false\",\r\n" + 
                "     \"id\": \"cargador48\",\r\n" + 
                "     \"attributes\": [\r\n" + 
                "        {\r\n" + 
                "          \"name\": \"speed\",\r\n" + 
                "          \"type\": \"float\",\r\n" + 
                "          \"value\": \"798\"\r\n" + 
                "        }\r\n" +  
                "      ]\r\n" + 
                "    }\r\n" + 
                "  ],\r\n" + 
                "  \"updateAction\": \"APPEND\"\r\n" + 
                "  }";

        StringEntity entity;
        try {
            entity = new StringEntity(json);
            httpPost.setEntity(entity);
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
            httpPost.setHeader("fiware-servicepath", "/");
            CloseableHttpResponse response;
                response = client.execute(httpPost);
            System.out.println(response.getStatusLine());
            client.close();

And the trace I generate is like this:

TRACE1

TRACE2

TRACE3

Thank you again.

The error message you are receiving would seem to indicate that you are attempting to send a subscription to Cygnus using the newer NGSI v2 format however the current Cygnus release only accepts notifications in the older NGSI v1 format- the attrsFormat=legacy attribute is therefore required when setting up the subscription

See this question for more details about how to fix it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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