2011-12-28 3 views
44

Я новичок в разработке Java и Android и пытаюсь создать простое приложение, которое должно связаться с веб-сервером и добавить некоторые данные в базу данных с помощью http get.Http Get using Android HttpURLConnection

Когда я звоню с помощью веб-браузера на своем компьютере, он работает нормально. Однако, когда я выполняю вызов, запускающий приложение в эмуляторе Android, данные не добавляются.

Я добавил интернет-доступ к манифесту приложения. Logcat не сообщает о каких-либо проблемах.

Может ли кто-нибудь помочь мне разобраться, что случилось?

Вот исходный код:

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

ответ

55

Попробуйте получить входной поток из этого, то вы можете получить текстовые данные в виде так: -

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

Вы можете, вероятно, использовать другие читатели InputStream такие как буферизованный читатель.

Проблема в том, что при открытии соединения - это не «тянет» любые данные.

+8

Вы должны закрыть свое соединение в блоке finally –

+0

Я специально использовал широкие исключения, чтобы метод не становился слишком многословным. Пользователи должны попробовать и использовать более конкретные, где это необходимо. – Davos555

+0

Я не могу найти, какое исключение выбрано отключением? – sttaq

3

Если вам просто нужно очень простой вызов, вы можете использовать URL непосредственно:

import java.net.URL; 

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

Вот полный AsyncTask класс

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

назвать этот AsyncTask класс

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

Я создал с c allBack (делегат) для класса 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(); 
    } 
} 

где

public interface OnTaskDoneListener { 
    void onTaskDone(String responseData); 

    void onError(); 
} 

Вы можете изменить в соответствии с вашими потребностями. Это для получения

+1

Это очень полезно. Однако у меня есть пара вопросов. Переменная mContext назначается без ссылки. Нужно ли быть там?Кроме того, нужно ли отключать соединение, как указано выше? –

+0

Если вам это не нужно, удалите его. но большую часть времени мне нужен контекст активности в AsyncTask. И второе - вы принимаете setConnectTimeout. Если задержка ответа составляет более 10 секунд. Перед вами ответное сообщение ANdrod NOt. – Nepster

+0

Я новичок в этой среде, пытаясь понять лучшие практики. @Luigi прокомментировал Davos555: «Вы должны закрыть свое соединение в блоке finally». Я вижу, что у вас есть br.close(), чтобы закрыть читателя, но должен ли быть httpConnection.disconnect() где-то, или это имеет значение? –

-3

URL url = новый URL ("https://www.google.com");

// если вы используете

URLConnection сопп = url.openConnection();

// изменить его на

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

+0

Он использует 'HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();'. – hofmeister

Смежные вопросы