浅谈Android中Http请求与缓存(上)

本文介绍了Android中使用HttpUrlConnection进行Http请求的基本步骤和封装,包括发送GET、POST请求,设置超时时间,以及Volley库的使用。讨论了如何发送Json数据、上传文件,以及处理响应。此外,还探讨了自定义Request时需要注意的点,如设置请求体、处理响应数据和响应监听。
摘要由CSDN通过智能技术生成

二月春风似剪刀,在这把剪刀的裁剪下,三月里春天正式拉开了她得帷幕,看到武大学妹发的樱花照片,正是美得无法收拾,令人陶醉,先给大家上两张,共同欣赏
这里写图片描述
来张近的:
这里写图片描述
再来张特写
这里写图片描述
好一只张可爱的乌龟:
这里写图片描述

连池塘里面的乌龟,都被这美景诱惑,爬上了水面,哈哈。。

时光荏苒,一转眼离开武大已经5年了,但是当我看到这些图的时候,我的思绪一下就回到了5年前,樱顶、梅园、情人坡、奥场… 种种场景历历在目,好怀念那所大学,下辈子,我愿意生在武大,长在武大,学在武大,老在武大…

好像越写越偏离主题了是不是,今天不是来跟大家分享技术的吗,哈哈。 好吧,还是先整理下思绪,开始正题吧,其实说不上分享,共同学习吧,我们知道樱花开了不是吗,但是想我这种人在杭州却想观赏武大樱花的朋友,尤其是像我这种毕业多年的校友们,肯定想一睹樱花的美丽,不要急,今天百度推出了樱花直播,朋友们,只需要在百度搜索里面搜索武大樱花节,就可以直接观看到武大樱花,从多种角度进行观赏,如果运气好的话,还可以看到很多漂亮的MM哦,哈哈,互联网给大家带来的实惠实在是明显了,我们今天要聊的话题其实跟樱花直播也有关系哦,我们知道在百度里面搜索的时候首先是不是要发一个HTTP请求,是不是,如果没有这个请求,我们怎么能拿到数据,或的直播的接口呢?哈哈关系是有点儿牵强,废话说太多了,让我们切入正题吧。

转载请注明出处http://blog.csdn.net/qinjunni2014/article/details/44570473

互联网对世界的影响越来越大,如今任何事物都可以跟互联网扯上关系了,连克强总理都在两会上提出了“互联网+”的概念,相信如今已经全面进入了互联网改造社会的时代,互联网是基于网络请求的,而Http请求就是网络请求中用的最多的一个请求,今天我们就来浅谈一下HTTP请求如何在Android中合理的使用。

1. HttpUrlConnection

Android中发送http请求有两种方法,一种是使用HttpClient,另外一种就是HttpUrlConnection,但是如今使用最多的是HttpUrlConnection,因为它更轻量,而且对缓存和安全的支持比较好。我们先来看一个基于HttpUrlConnection建立http请求最简单的例子,

String geturl = "http://www.baidu.com;
try {
    URL getUrl = new URL(geturl);
    HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
    // 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
    // 服务器
    connection.connect();
    // 取得输入流,并使用Reader读取
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            connection.getInputStream()));
    System.out.println("=============================");
    System.out.println("Contents of get request");
    System.out.println("=============================");
    String line;
    while ((line = reader.readLine()) != null) {
        Log.e("Junli", line);
    }
    reader.close();
    // 断开连接
    connection.disconnect();
    System.out.println("=============================");
    System.out.println("Contents of get request ends");
    System.out.println("=============================");
} catch (IOException e) {
    e.printStackTrace();
}

我们使用Get请求,去获得百度的主页,只需要简单地五步:

  1. new URL(String url)创建一个URL对象
  2. openConnection URL对象打开连接,获得一个HttpUrlConnection
  3. connect, 建立连接,我们知道http是基于Tcp的,这一步只是建立起Tcp连接,而并没有真正发http请求
  4. connection.getInputStream获取输入流,这一步才会真正去发request,拿到相应。

这个例子确实很简单,我们来看一个稍微复杂点的:

public void doPostRequest(String _url, List<NameValuePair> params) {
   URL url = null;
    try {
        url = new URL(_url);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded; charset= utf-8");

        conn.setDoInput(true);
        conn.setDoOutput(true);

        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getQuery(params));
        writer.flush();
        writer.close();

        os.close();
        conn.connect();
        conn.getResponseCode();
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));

        // do something on reader

        reader.close();
        // 断开连接
        conn.disconnect();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (NameValuePair pair : params) {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
    }

    return result.toString();
}

doPostRequst 通过调用setRequestMethod(“POST”) 尝试发送一个post请求,我们post请求是可以包含body的,我们可以讲我们需要传递给服务器的参数放在body部分。
1. setConnectTimeOut指定建立连接的超时时间,如果超过这个时间,就会抛出SocketTimeOutException,如果我们没有指定,那么默认值是0,但是不代表永远不超时,在数分钟之后仍然会抛出TCP超时
2. setReadTimeOut是指定数据读取的超时时间
3. setRequestProperty,设置请求的属性,在这个函数里面设置的属性,就是配置了Http请求头中的属性, 比如上面例子中,我们配置了Content-type属性
4. 通过connection.getOutPutStream拿到输出流,向这个流中写入我们想传得参数,当然在这之前我们必须调用setDoOutput(true)允许connection写入数据,
5. setDoInput 指定connection是否允许接受数据,默认情况下位true,通常不需要设置

如果我们每次,要发送http请求都需要自己构造HttpUrlConnection,确实很繁琐,多余,因为需要自己去设置header和body,部分。如果涉及到请求的取消等操作,那就更繁琐,如果能把这些东西继承起来,包装成一个更易容的接口岂不是更好,没错Volley就是这样一个库,类似的库有很多,比如ion,OkHttp等,我相信大部分人都熟练能够熟练使用volley了,如果还不会,请参考郭霖的文章,他详细讲解了volley的基本用法。今天我要讲的是volley是如何封装httpUrlConnection的。

2.封装

我们先从RequestQueue的创建看起

if (stack == null) {
   if (Build.VERSION.SDK_INT >= 9) {
        stack = new HurlStack();
    } else {
        // Prior to Gingerbread, HttpUrlConnection was unreliable.
        // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
        stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
    }
}

我们注意到在Volley.newRequestQueue时,我们会判断当前系统api版本,如果大于9,则会生成一个HurlStack,否则会生成一个HttpClientStack,其中HurlStack是使用HttpUrlConnection进行http请求的发送,而后者则是使用HttpClient。

我们直接进入到HurlStack,找到performRequest函数,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值