0

I am making a http-post request from my J2ME app for Nokia Asha 501(s40). I'm using the Nokia Asha SDK 1.0 for development.

Once the app tries to make http connection it goes directly into the finally clause of try-catch statement without throwing any exceptions.

In the emulator, the following message is displayed - "Something went wrong with running this app" - Screenshot-link

I then tried the sample http-post source code given in the Nokia developer forum and got the same result.

The code is given below.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*; 

public class HttpPOST extends MIDlet implements CommandListener {

private static String defaultURL = "http://localhost/api/signin"; 

private Display myDisplay = null;
private Form mainScreen;
private TextField requestField; 

private Form resultScreen;
private StringItem resultField;

Command sendCommand = new Command("SEND", Command.OK, 1);
Command backCommand = new Command("BACK", Command.OK, 1);

public HttpPOST()
{
    myDisplay = Display.getDisplay(this);
mainScreen = new Form("Type in a URL:");
requestField = new TextField(null, defaultURL, 100, TextField.URL);
mainScreen.append(requestField);
mainScreen.addCommand(sendCommand);
mainScreen.setCommandListener(this);
}

public void startApp() {myDisplay.setCurrent(mainScreen);}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {}

public void commandAction(Command c, Displayable s) 
{ 
if (c == sendCommand) 
{
    String urlstring = requestField.getString();

    String resultstring = sendPostRequest(urlstring);

    resultScreen = new Form("POST Result:");
    resultField = new StringItem(null, resultstring);
    resultScreen.append(resultField);
    resultScreen.addCommand(backCommand);
    resultScreen.setCommandListener(this);
    myDisplay.setCurrent(resultScreen);

} 
else if (c == backCommand) 
{
    requestField.setString(defaultURL);
    myDisplay.setCurrent(mainScreen); 
}
}

public String sendPostRequest(String urlstring) 
{
HttpConnection hc = null;
DataInputStream dis = null;
DataOutputStream dos = null;

String message = "";

String requeststring = "email=test@gmail.com&password=1234";
try 
{
    hc = (HttpConnection) Connector.open(urlstring, Connector.READ_WRITE);

    hc.setRequestMethod(HttpConnection.POST);

    dos = hc.openDataOutputStream();
    byte[] request_body = requeststring.getBytes();

    for (int i = 0; i < request_body.length; i++)
    {
        dos.writeByte(request_body[i]);
    }
    // flush outdos.flush();

    dis = new DataInputStream(hc.openInputStream());

    int ch;
    while ((ch = dis.read()) != -1) 
    {
        message = message + (char) ch;
    }

}
catch (IOException ioe) 
{
    message = "ERROR";
} 
finally 
{
    try 
    { 
        if (hc != null) 
            hc.close();
    }
    catch (IOException ignored) 
    {
    }
    try 
    { 
        if (dis != null) 
            dis.close();
    } 
    catch (IOException ignored) 
    {
    } 
    try 
    { 
        if (dos != null) 
            dos.close();
    } 
    catch (IOException ignored) 
    {
    } 
}
return message;
}
}

Somebody please help me out in solving this issue.

Thanks in advance.

1 Answers1

0

Please find below an example. It will helpful to somebody. It is tested in Nokia Asha 501, It is perfectly working.

  import javax.microedition.midlet.*;
  import javax.microedition.lcdui.*;
  import javax.microedition.io.*;
  import java.io.*;

  public class GetNpost extends MIDlet implements CommandListener
  {
private Display display;      // Reference to Display object
private Form fmMain;         // The main form
private Alert alError;       // Alert to error message
private Command cmGET;       // Request method GET
private Command cmPOST;      // Request method Post  
private Command cmExit;      // Command to exit the MIDlet
private TextField tfAcct;    // Get account number
private TextField tfPwd;     // Get password
private StringItem siBalance;// Show account balance
private String errorMsg = null;


GetNetworkConnection getObject = null;
PostNetworkConnection postObject = null;

GetNpost  mainObject = null;

public GetNpost()
{
    display = Display.getDisplay(this);

    mainObject = this;


    // Create commands
    cmGET = new Command("GET", Command.SCREEN, 2);
    cmPOST = new Command("POST", Command.SCREEN, 3);    
    cmExit = new Command("Exit", Command.EXIT, 1);

    // Textfields
    tfAcct = new TextField("Account:", "", 5, TextField.NUMERIC);
    tfPwd = new TextField("Password:", "", 10, TextField.ANY | TextField.PASSWORD);        

    // Balance string item
    siBalance = new StringItem("Balance: $", "");

    // Create Form, add commands & componenets, listen for events
    fmMain = new Form("Account Information");    
    fmMain.addCommand(cmExit);
    fmMain.addCommand(cmGET);
    fmMain.addCommand(cmPOST);

    fmMain.append(tfAcct);
    fmMain.append(tfPwd);
    fmMain.append(siBalance);

    fmMain.setCommandListener(this);   
}

public void startApp()
{
    display.setCurrent(fmMain);
}

public void pauseApp()
{ }

public void destroyApp(boolean unconditional)
{ }

public void commandAction(Command c, Displayable s)
{
    if (c == cmGET || c == cmPOST)
    {
        try 
        {
            if (c == cmGET){               
                getObject = new GetNetworkConnection();
                getObject.start();           
            }
            else{
                postObject = new PostNetworkConnection();
                postObject.start();          
            }
        }
        catch (Exception e)
        { 
            System.err.println("Msg: " + e.toString());
        }
    }
    else if (c == cmExit)
    {
        destroyApp(false);
        notifyDestroyed();
    } 
}

/*--------------------------------------------------
 * Access servlet using GET
 *-------------------------------------------------*/    
private void lookupBalance_withGET() throws IOException
{
    HttpConnection http = null;
    InputStream iStrm = null;    
    boolean ret = false;

    // Data is passed at the end of url for GET
    // don't use localhost as a ip
    String url = "http://(ip address):(port)/ServerSide/hello" + "?" +        
            "account=" + tfAcct.getString() + "&" + 
            "password=" + tfPwd.getString();


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

        //----------------
        // Client Request
        //----------------
        // 1) Send request method
        http.setRequestMethod(HttpConnection.GET);
        // 2) Send header information - none
        // 3) Send body/data -  data is at the end of URL

        //----------------
        // Server Response
        //----------------
        iStrm = http.openInputStream();      
        // Three steps are processed in this method call
        ret = processServerResponse(http, iStrm);
    }
    finally
    {
        // Clean up
        if (iStrm != null)
            iStrm.close();
        if (http != null)
            http.close();
    }

    // Process request failed, show alert    
    if (ret == false)
        showAlert(errorMsg);        
}

/*--------------------------------------------------
 * Access servlet using POST
 *-------------------------------------------------*/  
private void lookupBalance_withPOST() throws IOException
{
    HttpConnection http = null;
    OutputStream oStrm = null;
    InputStream iStrm = null;    
    boolean ret = false;

    // Data is passed as a separate stream for POST (below)
    // don't use localhost as a ip
    String url = "http://(ip address):(port)/ServerSide/hello";   



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

        //----------------
        // Client Request
        //----------------
        // 1) Send request type
        http.setRequestMethod(HttpConnection.POST); 

        // 2) Send header information. Required for POST to work!
        http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");


        oStrm = http.openOutputStream();      

        // If you experience connection/IO problems, try 
        // removing the comment from the following line
        //         http.setRequestProperty("Connection", "close");      

        // 3) Send data/body
        // Write account number
        byte data[] = ("account=" + tfAcct.getString()).getBytes();
        oStrm.write(data);

        // Write password
        data = ("&password=" + tfPwd.getString()).getBytes();
        oStrm.write(data);

        // For 1.0.3 remove flush command
        // See the note at the bottom of this file
        //      oStrm.flush();

        //----------------
        // Server Response
        //----------------
        iStrm = http.openInputStream();      
        // Three steps are processed in this method call      
        ret = processServerResponse(http, iStrm);
    }

    catch(Exception e){
        System.out.println("Error in Post: "+e.getMessage());
    }

    finally
    {
        // Clean up
        if (iStrm != null)
            iStrm.close();
        if (oStrm != null)
            oStrm.close();        
        if (http != null)
            http.close();
    }

    // Process request failed, show alert    
    if (ret == false)
        showAlert(errorMsg);        





}

/*--------------------------------------------------
 * Process a response from a server
 *-------------------------------------------------*/
private boolean processServerResponse(HttpConnection http, InputStream iStrm) throws IOException
{
    //Reset error message
    errorMsg = null;

    // 1) Get status Line
    if (http.getResponseCode() == HttpConnection.HTTP_OK)
    {
        // 2) Get header information - none

        // 3) Get body (data)
        int length = (int) http.getLength();
        String str;
        if (length != -1)
        {
            byte servletData[] = new byte[length];
            iStrm.read(servletData);
            str = new String(servletData);
        }
        else  // Length not available...
        {
            ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

            int ch;
            while ((ch = iStrm.read()) != -1)
                bStrm.write(ch);

            str = new String(bStrm.toByteArray());
            bStrm.close();
        }

        // Update the string item on the display
        siBalance.setText(str);
        return true;

    }
    else
        // Use message from the servlet
        errorMsg = new String( http.getResponseMessage());

    return false;      
}

/*--------------------------------------------------
 * Show an Alert
 *-------------------------------------------------*/
private void showAlert(String msg)
{
    // Create Alert, use message returned from servlet
    alError = new Alert("Error", msg, null, AlertType.ERROR);

    // Set Alert to type Modal
    alError.setTimeout(Alert.FOREVER);

    // Display the Alert. Once dismissed, display the form
    display.setCurrent(alError, fmMain);            
}


public class GetNetworkConnection extends Thread{
    public void run(){
        try {
            mainObject.lookupBalance_withGET();
        }
        catch(Exception e){
            System.out.println("Error in Get Connection: "+e.getMessage());
        }
    }
}


public class PostNetworkConnection extends Thread{
    public void run(){
        try {
            mainObject.lookupBalance_withPOST();
        }
        catch(Exception e){
            System.out.println("Error in Post Connection: "+e.getMessage());
        }
    }
}


}

The server side code is, (It is a servlet. Name is hello.java)

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author thirumalvalavan
 */
@WebServlet(name = "hello", urlPatterns = {"/hello"})
public class hello extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        // /*TODO output your page here
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet hello</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet hello at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
        // */
    } finally {
        out.close();
    }
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/** 
 * Handles the HTTP <code>GET</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
//        processRequest(request, response);

    String acct = request.getParameter("account"),
            pwd = request.getParameter("password");

    System.out.println("Hello Get Method::: " + acct + " " + pwd);

    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet hello</title>");
    out.println("</head>");
    out.println("<body>");
    out.print("<h1>Hi Get Method: </h1> <br> <h2> Your Account is: " + acct + "<br>   Your pwd is: " + pwd + "</h2>");
    out.println("</body>");
    out.println("</html>");
    out.close();
}

/** 
 * Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
//        processRequest(request, response);

    String acct = request.getParameter("account"),
            pwd = request.getParameter("password");

    System.out.println("Hello Post Method::: " + acct + " " + pwd);

    response.setContentType("text/plain");
    PrintWriter out = response.getWriter();

    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet hello</title>");
    out.println("</head>");
    out.println("<body>");
    out.print("<h1>Hi Post Method: </h1> <br> <h2> Your Account is: " + acct + "<br> Your pwd is: " + pwd + "</h2>");
    out.println("</body>");
    out.println("</html>");
    out.close();

}

/** 
 * Returns a short description of the servlet.
 * @return a String containing servlet description
 */
@Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>
}
Thirumalvalavan
  • 2,660
  • 1
  • 30
  • 32