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>
xml 要求本文がどのように見えるかについての COSM の 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 エラーに戻りました。そのため、応答本文を詳しく見てみると、データ ストリームに何か問題があるのではないかと思いました。フィード内のすべてのデータ ストリームを削除し、新しいフィードを作成すると、まさに 1 つの AWESOME HTTP:/1.1 201 が表示されます。満足ですよね? 最初の .POST の後、何も得られません。アプリをオフにしてから再びオンにすると、422 エラーと同じ応答本文「ストリーム ID は既に取得されています」に戻ります。うわぁ!