Android网络数据请求

Android网络数据请求

Android网络数据请求

做Android应用开发经常会与后台服务器进行交互获取数据
大多数的Android应用程序都会使用HTTP协议来发送和接收网络数据,而Android中主要提供了两种方式来进行HTTP操 作,HttpURLConnection和HttpClient。这两种方式都支持HTTPS协议、以流的形式进行上传和下载、配置超时时间、IPv6、 以及连接池等功能。

HttpClient:

    DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。

但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。

HttpURLConnection:

    HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。

    不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能:

private void disableConnectionReuseIfNecessary() {  
    // 这是一个2.2版本之前的bug  
    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {  
        System.setProperty("http.keepAlive", "false");  
    }  
}

 


HttpURLConnection使用代码

/**
 * 通过HttpURLConnection模拟post表单提交
 * @param path
 * @param params 例如"name=zhangsan&age=21"
 * @return
 * @throws Exception
 */
public static String sendPostRequest(String path, String params) throws Exception{
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("POST");// 提交模式
    conn.setConnectTimeout(10000);//连接超时 单位毫秒
    conn.setReadTimeout(5000);//读取超时 单位毫秒
    conn.setDoOutput(true);// 是否输入参数
    byte[] bypes = params.toString().getBytes();
    conn.getOutputStream().write(bypes);// 输入参数
    InputStream inStream=conn.getInputStream();
    return new String(readInputStream(inStream));
}
/**
 * 从输入流中读取数据
 * @param inStream
 * @return
 * @throws Exception
 */
public static byte[] readInputStream(InputStream inStream) throws Exception{
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len = 0;
    while( (len = inStream.read(buffer)) !=-1 ){
        outStream.write(buffer, 0, len);
    }
    byte[] data = outStream.toByteArray();//网页的二进制数据
    outStream.close();
    inStream.close();
    return data;
}


HttpClient实现的抓取URL源码

/**
 * 获取网页内容
 * @param url
 * @return
 * @throws Exception
 */
public String getWebPageContent(String url)throws Exception{
	StringBuilder sb = new StringBuilder();
	HttpClient client = new DefaultHttpClient();
	HttpParams httpParams = client.getParams();
	//设置网络超时参数
	HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
	HttpConnectionParams.setSoTimeout(httpParams, 10000);
	HttpResponse response = client.execute(new HttpGet(url));
	HttpEntity entity = response.getEntity();
	if (entity != null) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"),8192);
		String line = null;
		while ((line = reader.readLine())!= null) {
			sb.append(line+"\n");
		}
		reader.close();
	}
	return sb.toString();
	
}