2013-06-13 47 views
0

我正在爲我的J2ME應用程序提供Nokia Asha 501(s40)的http-post請求。我正在使用諾基亞Asha SDK 1.0進行開發。J2ME http post error - Nokia Asha SDK 1.0

一旦應用程序嘗試建立http連接,它會直接進入try-catch語句的finally子句,而不會引發任何異常。

在模擬器中,會顯示以下信息 - 「出了毛病,運行這個程序」 - Screenshot-link

然後我試圖在諾基亞開發者論壇中給出的樣本http發佈的源代碼,並得到了相同的結果。

代碼如下。

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 protected]&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; 
} 
} 

有人請幫我解決這個問題。

在此先感謝。

回答

0

請在下面找到一個例子。這對別人有幫助。它在諾基亞Asha 501上測試過,效果非常好。

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()); 
     } 
    } 
} 


} 

服務器端代碼,(它是一個servlet。名稱是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> 
}