Chunked web service response
can you please provide me with an example on how to read a chuncked response from a web service in Android
thanks
Edit: I'm try to call a soap web service, that replies to me with a base64 encoded string representing an image
here's the code:
String SOAP_ACTION = "service soap action";
try {
URL u = n开发者_如何学JAVAew URL("server url");
URLConnection uc = u.openConnection();
HttpURLConnection connection = (HttpURLConnection) uc;
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("SOAPAction", SOAP_ACTION);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-type", "text/xml; charset=utf-8");
String xmldata="soap request envelope";
//send the request
OutputStream out = connection.getOutputStream();
Writer wout = new OutputStreamWriter(out);
wout.write(xmldata);
wout.flush();
wout.close();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result;
StringBuilder builder=new StringBuilder();
//read response
while ((result=rd.readLine()) != null) {
builder.append(result);
}
Preachy Answers:
- You should really use a SOAP library rather than trying to re-invent the wheel: How to call a SOAP web service on Android
- If possible use a REST service rather than SOAP since SOAP is not suited for mobile platforms: http://javatheelixir.blogspot.com/2009/12/soap-vs-rest-in-service-layer-for.html
Practical Answer:
Problem:
- It seems you are only getting the first chunk of the response.
Possible solutions
- Try write(int c) instead of write(String str). Then ignore \r and \n characters.
- Use read() in a loop instead of readLine().
Note to questioner: Apologies for leaving in the Preachy answers. I am sure that you have considered those options. But it will help people who are able to use a SOAP library. If you have decided not to use a SOAP library for a specific reason please put it in the comments for the benifit of others.
Try to use more generalized classes, such as DefaultHttpClient and HttpPost to handle HTTP-interaction in a more higher level.
You do not want to use the urlconnection class. You'll want to use the httpclient bundled with android like follows.
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://something.com/something");
HttpResponse response = client.execute();
int code = response.getStatusLine().getStatusCode();
if(code == 200){
InputStream is = response.getEntity().getContent();
//Now parse the xml coming back
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
YourParser parser = new YourParser();
xr.setContentHandler(parser);
xr.parse(new InputSource(is));
}
You should simply need to create your xml parser to parse your objects. Hope this helps.
精彩评论