2012-12-12 1 views
0

일부 XML을 서버에 가져 오려고하지만 그 주안점은 내가하는 일에 상관없이 HttpPut은 Http 본문에 아무것도 넣지 않을 것이라는 점입니다. 서버는 항상 시체가 누락되었다고 말하며 Wireshark를 통해 그것을보고 있습니다. 아무 것도 없습니다! 요청을 설정하고 실행하는 데 사용하는 코드는 다음과 같습니다.안드로이드 HttpPut 엔티티 설정에도 불구하고 몸이 없음

HttpPut putRequest = new HttpPut(urlString]); 

StringEntity stringEntity = new StringEntity(xmlString, HTTP.ISO_8859_1); 
stringEntity.setContentType("text/xml"); 
putRequest.setEntity(stringEntity); 

putRequest.addHeader("Host", formatUrlForHostHeader(broadsoftUrl)); 
putRequest.addHeader("Authorization", authorizationString); 
putRequest.addHeader("Content-Type", "text/xml"); 
putRequest.addHeader("Accept", "text/xml"); 

response = httpClient.execute(putRequest); 

여기에 무엇을 포함해야할지 모르겠습니다. 4.2 및 4.0.3에서 시험해 보았습니다. 이 코드는 AsyncTask의 doInBackground에서 실행 중입니다. 내가받는 응답 코드는 409 Conflict이며, 본문은 서버의 응용 프로그램 별 메시지로 본문이 누락되었음을 나타냅니다. 나는 그것이 Wireshark와 함께 빠져있는 것을 확인했다.

편집 :

흥미로운 노트가 내 바탕 화면에 동일한 코드 독립를 실행하고,이 일 것입니다. 그래서, 안드로이드 버전의 HttpClient 나 시스템이 있을까요? 몇 가지 다른 API 레벨을 시도해 보았습니다.

의견이 있으십니까?

감사합니다.

+0

addHeader() 호출을 추가 한 순간부터이 사실을 알게되었습니다. addHeader()가 없으면 HttpPut이 나에게 잘 작동하고있다 ... 아마도 어딘가에서 bugreported해야만 할까? – sgielen

답변

0

좋아, 솔루션은 그냥 HttpPut과 모든 것을 포기하고 HttpURLConnection을 사용했습니다. 여기에 우리가 그 일을 결국 방법은 다음과 같습니다

URL url = new URL(theUrl); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setRequestProperty("Host", formatUrlForHostHeader(broadsoftUrl)); 
httpCon.setRequestProperty("Authorization", authorizationString); 
httpCon.setRequestProperty("Content-Type", "text/xml; charset=ISO_8859_1"); 
httpCon.setRequestProperty("Accept", "text/xml"); 
httpCon.setDoInput(true); 
httpCon.setDoOutput(true); 
httpCon.setRequestMethod("PUT"); 
OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream(), "ISO_8859_1"); 
out.write(xmlData); 
out.close(); 

if(httpCon.getErrorStream() == null) { 
    return ""; 
} else { 
    return "ERROR"; 
} 

우리는 우리의 PUT 요청의 응답을받을 필요가 없었다,하지만 오류 스트림이 존재하는지 확인하여 실패한 경우 확인. 당신이 응답을하고 싶다면, 당신은 같은 것을 할 것 : 물론

StringWriter writer = new StringWriter(); 
IOUtils.copy(httpCon.getInputStream(), writer, encoding); 
String responseString = writer.toString(); 

을 사용하면 앱에서 아파치의 IOTools을 포함해야합니다.

-1

409 충돌은 보통 Edit Conflict 오류와 관련이 있습니다. 일반적으로 요청과 충돌 할 수 있습니다.

당신이 게시하려고하고 호스트가 변경할 수 없습니다 기존 데이터가 가능성이되는 데이터의 유형

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

?

+0

XML을 HTTP 본문에 넣으려고합니다. 이는 위키가 아니며 요청이 특별히 데이터를 변경하는 것입니다. 어느 경우 든 서버는 몸에 아무것도 없다고 말하면서 Wireshark에서 나가는 요청을보고 확인했습니다. – boztalay

+0

setContentType의 캐릭터 세트를 명시 적으로 설정해, 그 것이 변경되는지 확인해주세요. 'stringEntity.setContentType ("text/xml; charset = ISO-8859-1");'[here] (http://www.massapi.com/source/apache-camel-2.5.0/components/camel- cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsRouterTest.java.html). – tim

+0

트릭을 수행하지 않은 것 같습니다. – boztalay