2011-12-28 5 views
44

Sono nuovo nello sviluppo di Java e Android e cerco di creare una semplice app che dovrebbe contattare un server Web e aggiungere alcuni dati a un database utilizzando un get http.Http Get using Android HttpURLConnection

Quando eseguo la chiamata utilizzando il browser Web nel mio computer funziona perfettamente. Tuttavia, quando eseguo la chiamata che esegue l'app nell'emulatore Android, non vengono aggiunti dati.

Ho aggiunto l'autorizzazione Internet al manifest dell'app. Logcat non segnala alcun problema.

Qualcuno può aiutarmi a capire cosa c'è che non va?

Ecco il codice sorgente:

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

risposta

55

provare a ottenere il flusso di input da questo si può quindi ottenere i dati di testo come così: -

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

probabilmente si può usare altri lettori InputStream tale anche come lettore bufferizzato.

Il problema è che quando apri la connessione, non "tira" alcun dato.

+8

È necessario chiudere la connessione in un blocco finale –

+0

Ho deliberatamente utilizzato le eccezioni generali per evitare che il metodo diventi troppo prolisso. Gli utenti dovrebbero provare e utilizzare quelli più specifici, ove appropriato. – Davos555

+0

Non riesco a trovare quale eccezione viene generata dalla disconnessione? – sttaq

3

Se avete solo bisogno di una chiamata molto semplice, è possibile utilizzare URL direttamente:

import java.net.URL; 

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

Ecco una completa AsyncTask classe

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

chiamare questo AsyncTask classe

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

Ho creato con c Risposta allBack (delegato) alla classe 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(); 
    } 
} 

dove

public interface OnTaskDoneListener { 
    void onTaskDone(String responseData); 

    void onError(); 
} 

È possibile modificare in base alle proprie esigenze. È per ottenere

+1

Questo è molto utile. Ho un paio di domande però. La variabile mContext è assegnata da mai referenziati. Ha bisogno di essere lì?Inoltre, la connessione deve essere disconnessa come commentato sopra? –

+0

Se non è necessario, rimuoverlo. ma la maggior parte delle volte ho bisogno di un contesto di attività in AsyncTask. E il secondo punto si sta prendendo su setConnectTimeout. Se c'è un ritardo nella risposta più di 10 secondi. Affronta un messaggio ANdrod NOt Responding. – Nepster

+0

Sono nuovo in questo ambiente, quindi cerco di capire le migliori pratiche. @Luigi ha commentato Davos555: "Dovresti chiudere la connessione in un blocco finale". Vedo che hai un br.close() per chiudere il lettore, ma dovrebbe esserci anche un httpConnection.disconnect() da qualche parte o importa? –

-3

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

// se si utilizza

URLConnection conn = url.openConnection();

// modificare a

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

+0

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