Llamar a servlet Java desde Android

Estoy tratando de obtener la salida de un servlet en un teléfono Android.

Este es mi servlet:

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package main; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author Bert Verhelst <[email protected]> */ public class servlet1 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(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet servlet1</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>processing...</h1>"); out.println("</body>"); out.println("</html>"); } // <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); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n" + "<html>\n" + "<head><title>Hello WWW</title></head>\n" + "<body>\n" + "<h1>doget...</h1>\n" + "</body></html>"); } /** * 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); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n" + "<html>\n" + "<head><title>Hello WWW</title></head>\n" + "<body>\n" + "<h1>dopost...</h1>\n" + "</body></html>"); } /** * Returns a short description of the servlet. * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> } 

Esta es mi página principal de Android:

  package be.smarttelecom.MyTest; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView output = (TextView) findViewById(R.id.output); try { output.append("starting\n"); RestClient client = new RestClient("http://10.0.0.188:8084/Servlet_1/servlet1"); try { client.Execute(RequestMethod.GET); } catch (Exception e) { e.printStackTrace(); } output.append("after execute\n"); String response = client.getResponse(); output.append("class - " + response + "\n" ); output.append(response); output.append("done\n"); } catch (Exception ex) { output.append("error: " + ex.getMessage() + "\n" + ex.toString() + "\n"); } } } 

Y finalmente tenemos el RestClient:

  package be.smarttelecom.MyTest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; public class RestClient { private ArrayList <NameValuePair> params; private ArrayList <NameValuePair> headers; private String url; private int responseCode; private String message; private String response; public String getResponse() { return response; } public String getErrorMessage() { return message; } public int getResponseCode() { return responseCode; } public RestClient(String url) { this.url = url; params = new ArrayList<NameValuePair>(); headers = new ArrayList<NameValuePair>(); } public void AddParam(String name, String value) { params.add(new BasicNameValuePair(name, value)); } public void AddHeader(String name, String value) { headers.add(new BasicNameValuePair(name, value)); } public void Execute(RequestMethod method) throws Exception { switch(method) { case GET: { //add parameters String combinedParams = ""; if(!params.isEmpty()){ combinedParams += "?"; for(NameValuePair p : params) { String paramString = p.getName() + "=" + p.getValue(); if(combinedParams.length() > 1) { combinedParams += "&" + paramString; } else { combinedParams += paramString; } } } HttpGet request = new HttpGet(url + combinedParams); //add headers for(NameValuePair h : headers) { request.addHeader(h.getName(), h.getValue()); } executeRequest(request, url); break; } case POST: { HttpPost request = new HttpPost(url); //add headers for(NameValuePair h : headers) { request.addHeader(h.getName(), h.getValue()); } if(!params.isEmpty()){ request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); } executeRequest(request, url); break; } } } private void executeRequest(HttpUriRequest request, String url) { HttpClient client = new DefaultHttpClient(); HttpResponse httpResponse; try { httpResponse = client.execute(request); responseCode = httpResponse.getStatusLine().getStatusCode(); message = httpResponse.getStatusLine().getReasonPhrase(); HttpEntity entity = httpResponse.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); response = convertStreamToString(instream); // Closing the input stream will trigger connection release instream.close(); } } catch (ClientProtocolException e) { client.getConnectionManager().shutdown(); e.printStackTrace(); } catch (IOException e) { client.getConnectionManager().shutdown(); e.printStackTrace(); } } private static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } } 

Lamentablemente esto no funciona. Aquí es lo que obtengo para salida (null),

Captura de pantalla de

¿Qué estoy haciendo mal?

Solicito el método DoGet de mi servlet y convertir la salida en una cadena, pero parece estar vacía.

He permitido la conexión a Internet en el archivo de manifiesto justo después del cierre de soporte de la aplicación,

 <uses-permission android:name="android.permission.INTERNET" /> 

Romain Hippeau escribió en un comentario:

¿La llamada llega alguna vez al servlet? ¿Qué está enviando el servidor? ¿Qué envía el servidor?

Ese fue el problema! Desactivé mi firewall y ahora funciona 🙂

Por qué utilizaste este puerto ip

 ("http://10.0.0.188:8084") 

Supongo que usted debe utilizar esto en lugar de para el simulador androide:

  "http://10.0.2.2:8080" 
  • ¿Cómo puedo verificar los datos firmados que vienen para la aplicación de facturación de Android Market utilizando Java (Servlet)
  • Qué es stringentity en android y su uso
  • Mantenimiento de la sesión HTTP al acceder a un servlet desde Android
  • Subir varios archivos de Android a AppEngine en 1 solicitud
  • ¿Cómo obtener Entity en el servlet usando MultipartEntity?
  • App Engine - RequestFactory vs servlets vs otros enfoques
  • Java.lang.ClassCastException: [Ljava.lang.Object; No se puede emitir a com.sakhnin.classes.MonthlySummary
  • Transferencia de datos enormes del servlet a la aplicación Android
  • Cómo pasar los datos del servlet a la aplicación android
  • Autenticación de Facebook en mi servidor con Android
  • Enviando mensaje a la aplicación del servidor con GCM
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.