2013-04-16 2 views
1

jpachube를 사용 중이며 creatDatastream에서 .POST와 관련된 문제가 있습니다. 나는 POST 오류 (400)를 받고, 그리고하고 COSM의 디버깅 도구에서 다음과 같은 세부 정보 :COSM JSON 파서 오류 (.POST)

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

다음과 같이 COSM 디버그 도구에서 내 XML 요청 본문은 다음과 같습니다 무엇 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의 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 방법으로 수정. 방법이이 COSM 디버그 도구에 .POST에 대한 다음과 같은 오류가 발생이

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")); 
     } 
    } 

같습니다 (오류 코드 422) :

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

그래서, 당연히,이 요청에 제목을 얻을 필요 . 즉 Data.java

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; 
} 

에 toXMLWithWrapper 통해 수행 그리고 요청 본문처럼 보이는 (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> 

일 세

,691입니다

xml에 문제가 있다는 지적이있었습니다 (아래 참조). 오타가 수정되었고 422 오류로 돌아 왔습니다. 따라서 응답 본문을 더 자세히 살펴보면 데이터 스트림에 문제가있을 수 있다고 생각했습니다. 피드의 모든 데이터 스트림을 삭제하고 새 피드를 만들고 정확히 하나의 HTTP를 얻습니다 : /1.1 201 - 행복합니다. 맞습니까? 틀렸어. 첫 번째. 포스 후에 나는 아무것도 얻지 못한다. 앱을 껐다가 다시 켤 때 422 오류로 돌아가고 동일한 응답 본문 "스트림 ID가 이미 사용되었습니다". Yikes!

+0

: https://github.com/cosm/cosm-java – errordeveloper

+0

액세스가 거부를! 나는 제다이 (또는 무엇인가)가 아니기 때문에 나는 그것을 볼 수 없었다. – user2056097

+0

제 개인적으로 베타 버전입니다. Cosm 지원팀에 이메일을 보내 액세스 권한을 얻을 수 있습니다. – errordeveloper

답변

0

단서는 json을 기대하지만 시스템에 XML을 제공한다는 것입니다. v2 API의 기본값은 json이므로 URL에 XML을 포함시켜야합니다 (예 :g는 :

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

또는이를 나타 내기 위해 요청에 콘텐츠 형식 헤더를 설정할 수는 XML이 유효하지 않을 수 있습니다처럼

Content-Type: application/xml 
+0

안녕하세요 - 귀하의 권장 사항을 시험해 보았습니다 (감사합니다!). 내 관측과 함께 원래의 게시물을 편집했는데 요약하면 COSM이 숨 막히거나 HTTP : //1.1 500을 받고있는 것처럼 보입니다. .POST (잘 작동합니다 .GET). – user2056097

1

것 같다.

개방 <environment> 노드를 두 번 <environment>>

+0

lebreeze - 요청 본문을 확인했는데 오타가있는 경우 (원래 게시물에서 수정 한 경우) – user2056097

+0

lebreeze를 확인하십시오! 내 XML에 오타가 있었는데, 그것을 고쳤습니다. 422 오류로 돌아 왔습니다. 위의 원래 게시물에이 정보를 넣을 것입니다. – user2056097

1

기존 피드에 POST에 노력하고 있기 때문에 422 아마 폐쇄 될 것으로 보인다.

피드를 업데이트하려면 PUT 요청을 보내야합니다.

는 참조 난 당신이 여기 찾을 수있는 새로운 자바 라이브러리가 존재한다는 것을 유의하고 싶습니다 Updating a feed docs

+0

안녕하세요 - 당신이 맞을지 모르고, 디버깅을 계속하고, 통찰력이 있거나 유용 할 때 게시하십시오. 감사. – user2056097