Search code examples
javanetwork-programmingblackberryblackberry-jde

Get HTML response after sending POST data via BlackBerry


I need to read an HTML response from a URL after sending it POST data. I already have the following two functions but I don't know how to combine them so that I can send POST data AND get the response.

This function gets a standard HTML response:

public static String getDataFromUrl(String url) throws IOException {
    System.out.println("------------FULL URL = " + url + " ------------");
    StringBuffer b = new StringBuffer();
    InputStream is = null;
    HttpConnection c = null;

    long len = 0;
    int ch = 0;
    c = (HttpConnection) Connector.open(url);
    is = c.openInputStream();
    len = c.getLength();
    if (len != -1) {
        // Read exactly Content-Length bytes
        for (int i = 0; i < len; i++)
            if ((ch = is.read()) != -1) {
                b.append((char) ch);
            }
    } else {
        // Read until the connection is closed.
        while ((ch = is.read()) != -1) {
            len = is.available();
            b.append((char) ch);
        }
    }

    is.close();
    c.close();
    return b.toString();
}

This function sends POST data to a URL:

void postViaHttpConnection(String url) throws IOException {
    HttpConnection c = null;
    InputStream is = null;
    OutputStream os = null;
    int rc;

    try {
        c = (HttpConnection) Connector.open(url);

        // Set the request method and headers
        c.setRequestMethod(HttpConnection.POST);
        c.setRequestProperty("If-Modified-Since", "29 Oct 1999 19:43:31 GMT");
        c.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.0");
        c.setRequestProperty("Content-Language", "en-US");

        // Getting the output stream may flush the headers
        os = c.openOutputStream();
        os.write("LIST games\n".getBytes());
        os.flush(); // Optional, getResponseCode will flush

        // Getting the response code will open the connection,
        // send the request, and read the HTTP response headers.
        // The headers are stored until requested.
        rc = c.getResponseCode();
        if (rc != HttpConnection.HTTP_OK) {
            throw new IOException("HTTP response code: " + rc);
        }

        is = c.openInputStream();

        // Get the ContentType
        String type = c.getType();
        processType(type);

        // Get the length and process the data
        int len = (int) c.getLength();
        if (len > 0) {
            int actual = 0;
            int bytesread = 0;
            byte[] data = new byte[len];
            while ((bytesread != len) && (actual != -1)) {
                actual = is.read(data, bytesread, len - bytesread);
                bytesread += actual;
            }
            process(data);
        } else {
            int ch;
            while ((ch = is.read()) != -1) {
                process((byte) ch);
            }
        }
    } catch (ClassCastException e) {
        throw new IllegalArgumentException("Not an HTTP URL");
    } finally {
        if (is != null)
            is.close();
        if (os != null)
            os.close();
        if (c != null)
            c.close();
    }
}

So I need to know how to combine them so that I can get the response AFTER sending POST data.


Solution

  • Try this following code and let me know ant issues

    Note: Url extension is important (Here i am using for wifi only Ex:";interface=wifi")

    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.microedition.io.Connector;
    import javax.microedition.io.HttpConnection;
    
    import net.rim.blackberry.api.browser.URLEncodedPostData;
    import net.rim.device.api.io.http.HttpProtocolConstants;
    
    public class HttpPostSample {
        HttpConnection hc = null;
        StringBuffer stringBuffer = new StringBuffer();
        InputStream inputStream;
    
        public HttpPostSample(String url) {
            try{
                hc = (HttpConnection)Connector.open(url+";interface=wifi");//you have to use connection extension ";interface=wifi" this is only for wifi 
                URLEncodedPostData oPostData = new URLEncodedPostData(URLEncodedPostData.DEFAULT_CHARSET, false);
                //These are your appending values and tags 
                oPostData.append("property_id","value");
                oPostData.append("property_name","value");
                oPostData.append("category","value");
                oPostData.append("address","value");
                oPostData.append("country","value");
                hc.setRequestMethod(HttpConnection.POST);
                hc.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_TYPE, oPostData.getContentType());
                byte [] postBytes = oPostData.getBytes();
                hc.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, Integer.toString(postBytes.length));
                OutputStream strmOut = hc.openOutputStream();
                strmOut.write(postBytes);
                strmOut.flush();
                strmOut.close();
    
                String returnMessage = hc.getResponseMessage();
                System.out.println("============"+returnMessage);
                if(hc.getResponseCode()==HttpConnection.HTTP_OK)
                {
                    inputStream = hc.openInputStream();
                    int c;
                    while((c=inputStream.read())!=-1)
                    {
                        stringBuffer.append((char)c);
                    }
                    System.out.println(">>>>>>>>>>>>>>>>>"+stringBuffer.toString());
                    parseResults(stringBuffer.toString());
    
                }else{
                    parseResults("ERROR");
                }
    
    
            }catch (Exception e) {
                // TODO: handle exception
            }
        }
        private void parseResults(String response)
        {
            if(response.equalsIgnoreCase("ERROR"))
            {
                System.out.println("Error in Connection please check your internet and Connection extension");
            }else{
                System.out.println(response);
            }
        }
    
    }
    

    You can call above function as

    HttpPostSample post=new HttpPostSample(url);
    

    you can see the output in console parseResults Method