.POST上的COSM JSON分析器错误

时间:2013-04-16 04:48:35

标签: java json cosm

我正在使用jpachube并且遇到了关于creatDatastream的.POST问题。我收到POST错误400,以及COSM调试工具的以下详细信息:

{"title":"JSON Parser Error","errors":"lexical error: invalid char in json text. <?   xmlversion=\"1.0\"encoding=\"U"}

来自COSM调试工具的我的XML请求主体如下:

<?xml version="1.0" encoding="UTF-8"?>
       <eeml xmlns="http://www.eeml.org/xsd/005"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5" xsi:schemaLocation="http://www.eeml.org/xsd/005 http://www.eeml.org/xsd/005/005.xsd"><environment><data id="0">
       <tag>CPU</tag>
            <current_value>0.0</current_value>
        </data>
       </environment>
   </eeml>

COSM关于xml请求正文应该是什么样的API文档如下:

<eeml xmlns="http://www.eeml.org/xsd/0.5.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-     instance" version="0.5.1" xsi:schemaLocation="http://www.eeml.org/xsd/0.5.1   http://www.eeml.org/xsd/0.5.1/0.5.1.xsd">
  <environment>
    <data id="23">
      <tag>apple</tag>
      <tag>jag</tag>
      <tag>tag</tag>
      <tag>lag</tag>
      <current_value>11</current_value>
      <max_value>211.0</max_value>
      <min_value>7.0</min_value>
    <unit type="conversionBasedUnits" symbol="symbol">label</unit>
  </data>
</environment>

我找到的唯一区别是版本#,但我已经在代码中进行了切换并得到了相同的错误。

我认为已经设置了COSM API的v2,因此xml和JSON是可互换的,但它将所有内容转换为JSON。

错误来自Pachube.java中的此方法调用

public boolean createDatastream(int feed, String s) throws PachubeException {
        HttpRequest hr = new HttpRequest("http://api.cosm.com/v2/feeds/"
                + feed + "/datastreams/");
        hr.setMethod(HttpMethod.POST);
        hr.addHeaderItem("X-PachubeApiKey", this.API_KEY);
        hr.setBody(s);
        HttpResponse g = this.client.send(hr);

        if (g.getHeaderItem("Status").equals("HTTP/1.1 201 Created")) {
            return true;
        } else {
            throw new PachubeException(g.getHeaderItem("Status"));
        }
    }

任何意见都赞赏。

第二天......

使用bjpirt的输入修改了createDatastream方法(非常感谢)。方法看起来像这样

public boolean createDatastream(int feed, String s) throws PachubeException {

        HttpRequest hr = new HttpRequest("http://api.cosm.com/v2/feeds/"
                + feed + "/datastreams.xml");
        hr.setMethod(HttpMethod.POST);
        hr.addHeaderItem("X-PachubeApiKey", this.API_KEY);
        hr.addHeaderItem("Content-Type:", "application/xml");
        hr.setBody(s);
        HttpResponse g = this.client.send(hr);

        if (g.getHeaderItem("Status").equals("HTTP/1.1 201 Created")) {
            return true;
        } else {
            Log.d("create data stream", "prob");
            throw new PachubeException(g.getHeaderItem("Status"));
        }
    }

这会在COSM调试工具上抛出.POST的以下错误(错误代码422):

<?xml version="1.0" encoding="UTF-8"?><errors><title>Unprocessable Entity</title>         <error>Stream ID has already been taken</error></errors>

所以,当然,我需要根据这个要求获得一个标题。这是通过Data.java中的toXMLWithWrapper完成的。

public String toXMLWithWrapper() {
    String ret = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<eeml xmlns=\"http://www.eeml.org/xsd/005\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"5\" xsi:schemaLocation=\"http://www.eeml.org/xsd/005 http://www.eeml.org/xsd/005/005.xsd\"><environment>";
    ret = ret + ">\n\t<title>" + "cosm app" + "</title>\n\t";//inserted this line to add title
    ret = ret + this.toXML() + "</environment></eeml>";
    return ret;
}

请求正文(来自COSM调试工具):

<?xml version="1.0" encoding="UTF-8"?>
<eeml xmlns="http://www.eeml.org/xsd/005" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5" xsi:schemaLocation="http://www.eeml.org/xsd/005 http://www.eeml.org/xsd/005/005.xsd"><environment>
<title>cosm app</title>
<data id="0">
    <tag>CPU</tag>
    <current_value >0.0</current_value>
</data></environment></eeml>

这会返回错误代码500(哎哟!)

回复正文

<?xml version="1.0" encoding="UTF-8"?><errors><title>Oops, something's broken</title>  <error>We've been unable to complete your request due to a problem with our server</error></errors>

第三天

有人指出xml存在问题(见下文)。我修正了错误,我又回到了422错误。所以,仔细观察响应主体,我想也许数据流有问题。我删除了Feed中的所有数据流,创建了一个新的Feed,然后我得到了一个非常好的HTTP:/1.1 201 - 很开心,对吧?错了,在第一次之后.POST我什么都没得到。当我关闭应用程序然后重新打开时,我又回到422错误并且响应正文“流ID已被占用”。糟糕!

3 个答案:

答案 0 :(得分:1)

似乎xml可能无效。

开场<environment>节点似乎关闭两次<environment>>

答案 1 :(得分:1)

422可能是因为您尝试POST现有Feed。

要更新Feed,您需要发送PUT请求。

请参阅Updating a feed docs

答案 2 :(得分:0)

线索是系统看起来像是期待json,但是你正在为它提供XML。 v2 api的默认值是json,因此您需要确保在URL中包含XML,例如:

https://api.cosm.com/v2/feeds/113/datastreams.json

或者,您可以在请求上设置内容类型标题以指示:

Content-Type: application/xml