1

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 は既に取得されています」に戻ります。うわぁ!

4

3 に答える 3

1

422 はおそらくPOST、既存のフィードにアクセスしようとしているためです。

PUTフィードを更新するには、リクエストを送信する必要があります。

フィードの更新ドキュメントを参照してください

于 2013-04-18T08:12:24.663 に答える
1

xml が無効なようです。

開始<environment>ノードが 2 回閉じられているようです<environment>>

于 2013-04-16T22:55:43.967 に答える
0

手がかりは、システムがjsonを期待しているように見えますが、XMLを供給していることです。v2 API のデフォルトは json であるため、URL に XML が含まれていることを確認する必要があります。

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

または、リクエストにコンテンツ タイプ ヘッダーを設定して、これを示すこともできます。

Content-Type: application/xml
于 2013-04-16T07:03:43.477 に答える