2011-12-28 53 views
44

我是Java和Android开发的新手,尝试创建一个简单的应用程序,该应用程序应联系Web服务器并使用http get向数据库添加一些数据。Http使用Android HttpURLConnection

当我使用我的电脑中的网络浏览器进行通话时,它的工作原理很好。但是,当我在Android模拟器中执行运行应用程序的调用时,不会添加任何数据。

我已将Internet权限添加到应用的清单。 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块 – 2014-01-29 13:15:50

+0

我故意使用了广泛的例外,以防止变得太冗长。用户应该尝试在适当的地方使用更具体的。 – Davos555 2015-06-09 13:36:56

+0

我无法找到断开连接引发了什么异常? – sttaq 2015-11-26 09:46:14

3

如果你只需要一个很简单的通话,你可以直接使用网址:

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由永不引用分配。它需要在那里吗?另外,连接是否需要断开连接,如上所述? – 2016-11-13 09:03:21

+0

如果你不需要它,然后删除它。但大多数时候我需要AsyncTask中的活动上下文。第二点是关于setConnectTimeout。如果响应延迟超过10秒。你面对一条ANDROD NOT回应消息。 – Nepster 2016-11-14 05:57:05

+0

我对这个环境很陌生,所以想要了解最佳实践。 @Luigi对Davos555发表了评论:“你应该在最后一块封闭你的连接”。我看到你有一个br.close()来关闭阅读器,但是应该在某处还有一个httpConnection.disconnect(),或者它有什么关系? – 2016-11-14 18:30:43

-3

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

//如果使用的是

的URLConnection康恩= url.openConnection();

//它更改为

HttpURLConnection的康恩=(HttpURLConnection类)url.openConnection();

+0

他使用'HttpURLConnection urlConnection =(HttpURLConnection)url.openConnection();'。 – hofmeister 2016-11-02 08:45:02

相关问题