我正在使用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已被占用”。糟糕!
答案 0 :(得分:1)
似乎xml可能无效。
开场<environment>
节点似乎关闭两次<environment>>
答案 1 :(得分:1)
答案 2 :(得分:0)
线索是系统看起来像是期待json,但是你正在为它提供XML。 v2 api的默认值是json,因此您需要确保在URL中包含XML,例如:
https://api.cosm.com/v2/feeds/113/datastreams.json
或者,您可以在请求上设置内容类型标题以指示:
Content-Type: application/xml