tags:

views:

12

answers:

1

From the simulator, this all works.

I'm using wifi on the device as i'm assuming it's the most stable.

The problem occurs when i try to post more than 1.5K of urlencoded data.

If i send less then it's fine.

It seems to hang the .flush command();

It works on a physical 9700, so i'm presuming that it's possibly device specific

In the example below i'm using form variables, but i've also tried posting the content type json, but still had the same issue

I've written a small testapp, and using the main thread so i know that it's not threads getting confused

If anyone has any ideas that would be great.

private String PostEventsTest()
 {
  String returnValue = "Error";
  HttpConnection hc = null;
  DataInputStream dis = null;
  DataOutputStream dos = null;
  StringBuffer messagebuffer = new StringBuffer();
  URLEncodedPostData postValuePairs;
  try
  {

   postValuePairs = new URLEncodedPostData(null, false);
   postValuePairs.append("DATA",postData);// postData);
   hc = (HttpConnection) Connector.open(postURL, Connector.READ_WRITE);
   hc.setRequestMethod(HttpConnection.POST);
   hc.setRequestProperty("User-Agent", "BlackBerry");
   hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
   hc.setRequestProperty("Content-Length", Integer.toString(postValuePairs.getBytes().length));
   //hc.setRequestProperty("Content-Length", Integer.toString(postData.length()));



   dos = hc.openDataOutputStream();
   dos.write(postValuePairs.getBytes());
   dos.flush();
   dos.close();
   // Retrieve the response back from the servlet
   dis = new DataInputStream(hc.openInputStream());
   int ch;
   // Check the Content-Length first
   long len = hc.getLength();
   if (len != -1)
   {
    for (int i = 0; i < len; i++)

     if ((ch = dis.read()) != -1)
      messagebuffer.append((char) ch);
   }
   else
   { // if the content-length is not available
    while ((ch = dis.read()) != -1)
     messagebuffer.append((char) ch);
   }
   dis.close();
   returnValue = "Yahoo";
  }
  catch (Exception ex)
  {
   returnValue = ex.toString();
   ex.printStackTrace();
  }

  return returnValue;

 }
A: 

Instead of data streams you should just use the regular input and output streams. So instead of hc.openDataOutputStream() use hc.openOutputStream(). Data streams are for serializing Java objects to a stream, but you just want to write the raw bytes to the stream -- so a regular outputstream is what you want. Same for reading the response - just use the inputstream returned by hc.openInputStream()

Marc Novakowski
Hi Marc, i've also tried that, and have the same result.
jpspringall