2011-12-28 18 views
44

Soy nuevo en el desarrollo de Java y Android y trato de crear una aplicación simple que debe contactarse con un servidor web y agregar algunos datos a una base de datos usando http get.Http Get using Android HttpURLConnection

Cuando hago la llamada usando el navegador web en mi computadora funciona bien. Sin embargo, cuando hago la llamada ejecutando la aplicación en el emulador de Android, no se agregan datos.

He añadido permiso de Internet para el manifiesto de la aplicación. Logcat no informa ningún problema.

¿Alguien me puede ayudar a descubrir qué pasa?

Aquí está el código fuente:

package com.example.httptest; 

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class HttpTestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     TextView tv = new TextView(this); 
     setContentView(tv); 

     try { 
      URL url = new URL("http://www.mysite.se/index.asp?data=99"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.disconnect(); 
      tv.setText("Hello!"); 
     } 
     catch (MalformedURLException ex) { 
      Log.e("httptest",Log.getStackTraceString(ex)); 
     } 
     catch (IOException ex) { 
      Log.e("httptest",Log.getStackTraceString(ex)); 
     } 
    }   
} 

Respuesta

55

intentar conseguir el flujo de entrada de este a continuación, puede obtener los datos de texto como tal: -

URL url; 
    HttpURLConnection urlConnection = null; 
    try { 
     url = new URL("http://www.mysite.se/index.asp?data=99"); 

     urlConnection = (HttpURLConnection) url 
       .openConnection(); 

     InputStream in = urlConnection.getInputStream(); 

     InputStreamReader isw = new InputStreamReader(in); 

     int data = isw.read(); 
     while (data != -1) { 
      char current = (char) data; 
      data = isw.read(); 
      System.out.print(current); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (urlConnection != null) { 
      urlConnection.disconnect(); 
     }  
    } 

es probable que pueda utilizar otros lectores InputStream tales como lector tamponado también.

El problema es que cuando abre la conexión, no 'extrae' ningún dato.

+8

Debería cerrar su conexión en un bloque finally –

+0

Deliberadamente utilicé amplias excepciones para evitar que el método se vuelva demasiado detallado. Los usuarios deberían probar y usar más específicos cuando corresponda. – Davos555

+0

¿No puedo encontrar qué excepción arroja la desconexión? – sttaq

3

Si sólo necesita una llamada muy simple, puede utilizar URL directamente:

import java.net.URL; 

    new URL("http://wheredatapp.com").openStream(); 
26

Aquí es una completa AsyncTask clase

public class GetMethodDemo extends AsyncTask<String , Void ,String> { 
    String server_response; 

    @Override 
    protected String doInBackground(String... strings) { 

     URL url; 
     HttpURLConnection urlConnection = null; 

     try { 
      url = new URL(strings[0]); 
      urlConnection = (HttpURLConnection) url.openConnection(); 

      int responseCode = urlConnection.getResponseCode(); 

      if(responseCode == HttpURLConnection.HTTP_OK){ 
       server_response = readStream(urlConnection.getInputStream()); 
       Log.v("CatalogClient", server_response); 
      } 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 

     Log.e("Response", "" + server_response); 


    } 
} 

// Converting InputStream to String 

private String readStream(InputStream in) { 
     BufferedReader reader = null; 
     StringBuffer response = new StringBuffer(); 
     try { 
      reader = new BufferedReader(new InputStreamReader(in)); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       response.append(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return response.toString(); 
    } 

llamar a este AsyncTask clase

new GetMethodDemo().execute("your web-service url"); 
7

He creado con c respuesta AllBack (delegado) a la clase Activity.

public class WebService extends AsyncTask<String, Void, String> { 

    private Context mContext; 
    private OnTaskDoneListener onTaskDoneListener; 
    private String urlStr = ""; 

    public WebService(Context context, String url, OnTaskDoneListener onTaskDoneListener) { 
     this.mContext = context; 
     this.urlStr = url; 
     this.onTaskDoneListener = onTaskDoneListener; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 

      URL mUrl = new URL(urlStr); 
      HttpURLConnection httpConnection = (HttpURLConnection) mUrl.openConnection(); 
      httpConnection.setRequestMethod("GET"); 
      httpConnection.setRequestProperty("Content-length", "0"); 
      httpConnection.setUseCaches(false); 
      httpConnection.setAllowUserInteraction(false); 
      httpConnection.setConnectTimeout(100000); 
      httpConnection.setReadTimeout(100000); 

      httpConnection.connect(); 

      int responseCode = httpConnection.getResponseCode(); 

      if (responseCode == HttpURLConnection.HTTP_OK) { 
       BufferedReader br = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); 
       StringBuilder sb = new StringBuilder(); 
       String line; 
       while ((line = br.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       br.close(); 
       return sb.toString(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 

     if (onTaskDoneListener != null && s != null) { 
      onTaskDoneListener.onTaskDone(s); 
     } else 
      onTaskDoneListener.onError(); 
    } 
} 

donde

public interface OnTaskDoneListener { 
    void onTaskDone(String responseData); 

    void onError(); 
} 

Se puede modificar de acuerdo a sus necesidades. Es para obtener

+1

Esto es muy útil. Aunque tengo un par de preguntas. La variable mContext se asigna por referencia nunca. ¿Necesita estar ahí?Además, ¿la conexión debe desconectarse como se comentó anteriormente? –

+0

Si no lo necesita, quítelo. pero la mayoría de las veces necesito contexto de actividad en AsyncTask. Y el segundo punto es acerca de setConnectTimeout. Si hay un retraso en la respuesta más de 10 segundos Te enfrentas a un mensaje ANdrod NO Respondiendo. – Nepster

+0

Soy nuevo en este entorno, por lo que intento comprender las mejores prácticas. @Luigi comentó a Davos555: "Deberías cerrar tu conexión en un bloque final". Veo que tiene un br.close() para cerrar el lector, pero ¿debería haber un httpConnection.disconnect() en alguna parte, o importa? –

-3

URL url = new URL ("https://www.google.com");

// si está utilizando

URLConnection conn = url.openConnection();

// cambiarlo a

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

+0

Está usando 'HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();'. – hofmeister

Cuestiones relacionadas