2011-12-28 45 views
44

का उपयोग कर प्राप्त करें मैं जावा और एंड्रॉइड विकास के लिए नया हूं और एक सरल ऐप बनाने की कोशिश करता हूं जो एक वेब सर्वर से संपर्क करना चाहिए और http प्राप्त करने के लिए डेटाबेस में कुछ डेटा जोड़ना चाहिए।एचटीपी एंड्रॉइड HttpURLConnection

जब मैं अपने कंप्यूटर में वेब ब्राउज़र का उपयोग करके कॉल करता हूं तो यह ठीक काम करता है। हालांकि, जब मैं एंड्रॉइड एमुलेटर में ऐप चलाने वाला कॉल करता हूं तो कोई डेटा नहीं जोड़ा जाता है।

मैंने ऐप के मैनिफेस्ट में इंटरनेट अनुमति जोड़ा है। 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

आप एक अंत में –

+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
कॉल करने

मैंने सी के साथ बनाया है गतिविधि वर्ग के लिए allBack (प्रतिनिधि) प्रतिक्रिया।

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 में गतिविधि संदर्भ की आवश्यकता होती है। और दूसरा बिंदु आप सेटकनेक्टटाइमआउट के बारे में ले रहे हैं। यदि प्रतिक्रिया में देरी हो तो 10 सेकंड। आप एक एनाडोड नोटी प्रतिक्रिया संदेश का सामना करते हैं। – Nepster

+0

मैं इस माहौल में नया हूं इसलिए सर्वोत्तम प्रथाओं को समझने की कोशिश कर रहा हूं। @ लुइगी ने Davos555 पर टिप्पणी की: "आपको अंत में ब्लॉक में अपना कनेक्शन बंद करना चाहिए"। मैं देखता हूं कि पाठक को बंद करने के लिए आपके पास br.close() है, लेकिन क्या कहीं भी httpConnection.disconnect() होना चाहिए, या इससे कोई फर्क पड़ता है? –

-3

यूआरएल यूआरएल = नया यूआरएल ("https://www.google.com") प्राप्त करने के लिए है;

// अगर आप

URLConnection Conn = url.openConnection() का उपयोग कर रहे हैं;

// यह करने के लिए

HttpURLConnection Conn = (HttpURLConnection) url.openConnection() बदल;

+0

वह 'HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 'का उपयोग कर रहा है। – hofmeister

संबंधित मुद्दे