1.概述

Android中提供了两种执行网络请求的方式,一种是使用Apache的HttpClient,另一种则是java的HttpURLConnection。

2.HttpClient

HttpClient是一个完善的客户端,提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET和HTTP POST调用。由于在android6.0中,HttpClient库已经被移除,因此,在本文中简单介绍下HttpClient,不作细研究,重点介绍HttpURLConnection。HttpClient的一般使用步骤如下:

//(1)使用DefaultHttpClient类实例化HttpClient对象,设置默认的请求参数;
HttpClient httpclient = new DefaultHttpClient(defaultHttpParams());
//(2)创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象;
HttpGet httpget = new HttpGet(url);
//添加header
httpget.addHeader("connection","Keep-Alive");
//(3)调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象;
HttpResponse response = new httpclient.execute(httpget);
//(4)通过HttpResponse接口的getEntity方法返回响应信息,并进行相应处理
HttpEntity entity = response.getEntity();
if (entity != null) {
    InputStream instream = entity.getContent();
    //解析处理结果,将请求结果转化为String类型
    String result = convertStreamToString(instream);
    instream.close();
}

HTTP GET 调用的一个缺点就是,请求的参数作为URL一部分来传递,这样使得请求参数等信息都会直接暴露在URL中。

POST请求参数通过键值对的形式存储在List中,然后将所有参数打包到UrlEncodedFromEntity实体对象中,最后通过HttpClient进行发送。

3.HttpURLConnection

HttpURLConnection是最佳的选择,因为它的APU简单,体积较小,因而非常适用于Android项目。HttpURLConnection的压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大作用,在Android6.0之后成为我们进行网络请求的唯一选择。

使用HttpURLConnection的示例代码如下:

private void sendRequest(String url) throws IOException {
    InputStream is = null;
    try {
        URL newUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection)newUrl.openConnection();
        //设置读超时为10s
        conn.setReadTimeout(10*1000);
        //设置链接超时为15s
        conn.setConnectTimeout(15*1000);
        // 设置请求方式,如果是Get请求值为“GET“,Post则为“POST“
        conn.setRequestMethod("POST");
        //接收输入流
        conn.setDoInput(true);
        //启动输出流,当需要传递参数时需要开启
        conn.setDoOutput(true);
        //添加Header
        conn.setRequestProperty("Connection","Keep-Alive");
        //添加参数,如果是Get请求,参数要写在URL中
        List<NameValuePair> paramsList = new ArrayList<NameValuePair>();
        paramsList.add(new BasicNameValuePair("username","chunsoft"));
        paramsList.add(new BasicNameValuePair("pwd","123456"));
        writeParams(conn.getInputstream(),paramList);
        //发起请求
        conn.connect();
        is = conn.getInputStream();
        //获取结果
        String result = convertStreamToString(is);
    }finally {
        if(is != null) {
            is.close();
        }
    }
}
无觅关联推荐,快速提升流量