Android网络请求库对比之HttpUrlConnection和HttpClient

   

一、HttpUrlConnection

    最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android 2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android 2.3以后使用HttpUrlConnection,之前使用HttpClient。

     在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。
特点
  • 比较轻便,灵活,易于扩展
  • 在3.0后以及4.0中都进行了改善,如对HTTPS的支持
  • 在4.0中,还增加了对缓存的支持
用法
  1. 首先我们需要获取到一个HttpURLConnection实例,一般需要new出一个URL对象,并传入目标网络地址,通过调用openConnection()方法获得HttpURLConnection实例。
  2. 得到该实例后。我们需要设置一下http请求的的方法,这里我们主要研究get和post,默认是使用get方法。get一般用于从服务器获取数据,post一般用于向服务器提交数据,设置请求方法使用函数setRequestMethod(“POST”)进行设置。
  3. 此外可以进行一些请求的限制,比如连接超时的时间等,可以通过setConnectTimeout设置超时时间。
  4. 获取服务器返回的输入流,使用getInputStream方法获取。
  5. 读取内容并处理
  6. 关闭连接,通过调用disconnect方法关闭当前的连接。
废话不多说,直接上代码~
package com.happy.network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;

/**
 * HttpUrlConnection
 * 在2.2版本之前存在bug,推荐使用httpClient.
 * 2.2版本之后,推荐使用httpUrlConnection.
 * 优点:
 * 体积小 api简单 方便 灵活 扩展性高
 * 3.0及4.0进行了改善,增加了对Htpps的支持
 * 4.0中还增加了缓存的支持
 * Created by me on 2015/10/27.
 */
public class HttpUrlConnectionDemo {

    /**
     * get请求
     *
     * @param urlPath
     * @return
     */
    private String get(String urlPath) {
        HttpURLConnection conn = null;
        InputStream is = null;
        BufferedReader br = null;
        try {
            URL url = new URL(urlPath);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");// 设置请求方式
            conn.setReadTimeout(50000); // 设置读取超时时间
            conn.setConnectTimeout(50000); //设置连接超时时间
            conn.setDoInput(true); // 设置是否从httpurlconnection中读入
            conn.setUseCaches(false); // 设置是否使用缓存
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                is = conn.getInputStream();// 获取服务端返回数据
                br = new BufferedReader(new InputStreamReader(is));
                StringBuffer sb = new StringBuffer();
                String line = null;
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
                return sb.toString();
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();
                conn = null;
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * post请求
     *
     * @param urlPath
     * @param params
     * @return
     */
    public String post(String urlPath, Map<String, String> params) {
        if (params == null || params.isEmpty()) {
            return get(urlPath);
        }
        HttpURLConnection conn = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        StringBuffer sb = getParamStr(params);
        byte[] data = sb.toString().getBytes();
        try {
            URL url = new URL(urlPath);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setConnectTimeout(50000);
            conn.setReadTimeout(50000);
            conn.setUseCaches(false);
            conn.setDoInput(true);
            conn.setDoOutput(true);// 设置为true才能写入参数
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-Length", String.valueOf(data.length));
            os = conn.getOutputStream();
            os.write(data);//写入参数
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                is = conn.getInputStream();
                br = new BufferedReader(new InputStreamReader(is));
                StringBuffer response = new StringBuffer();
                String line = null;
                while ((line = br.readLine()) != null) {
                    response.append(line);
                }
                return response.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();
                conn = null;
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * post请求组织参数
     *
     * @param params
     * @return
     */
    private StringBuffer getParamStr(Map<String, String> params) {
        StringBuffer sb = new StringBuffer();
        Iterator<Map.Entry<String, String>> entryIterator = params.entrySet().iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String, String> next = entryIterator.next();
            sb.append(next.getKey() + "=" + next.getValue());
            if (entryIterator.hasNext()) {
                sb.append("&");
            }
        }
        return null;
    }

}

二、HttpClient

特点
  • 高效稳定,但是维护成本高昂,故android 开发团队不愿意在维护该库而是转投更为轻便的HttpUrlConnection
用法
  1. HttpClient是一个接口,因此无法直接创建它的实例,一般都是创建一个DefaultHttpClient实例
  2. 如果要发起Get请求,需要创建一个HttpGet对象,并传入请求地址
  3. 如果要发起Post请求,需要创建一个HttpPost对象。并传入请求地址,通过setEntity函数设置请求参数
  4. 调用execute方法,传入HttpGet或者HttpPost实例,执行后返回HttpResponse对象,判断响应状态码
  5. 解析响应结果,通过调用getEntity函数获得一个HttpEntity对象,之后可以通过EntityUtils.toString方法将其转换为字符串
         由于在android2.3之后就被HttpUrlConnection取代了,这里也不过多介绍了,不过当初学习它的时候还没接触到其他库,就感觉它好方便,下面简单贴出使用方法
package com.happy.network;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;

import java.io.IOException;
import java.util.List;

/**
 * 稳定性高,但维护成本高,已被android团队使用httpUrlConnection替代
 * Created by me on 2015/10/27.
 */
public class HttpClientDemo {

    private String get(String url){
        HttpClient client=null;
        HttpGet request=null;
        try {
            client=new DefaultHttpClient();
            request=new HttpGet(url);
            HttpResponse response=client.execute(request);
            if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
                String result=EntityUtils.toString(response.getEntity(),"UTF-8");
                return result;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  null;
    }

    private String post(String url,List<NameValuePair> params){
        HttpClient client=null;
        HttpPost request=null;
        try {
            client=new DefaultHttpClient();
            request=new HttpPost(url);
            request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            HttpResponse response=client.execute(request);
            if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
                String result=EntityUtils.toString(response.getEntity(),"UTF-8");
                return result;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  null;
    }

}
   欧克,大体使用方法及对比就这些了,部分文字描述来源于网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值