专栏首页技术小黑屋Android中HTTP相关的API

Android中HTTP相关的API

Android中大多数应用都会发送和接受HTTP请求,在Android API中主要由两个HTTP请求的相关类,一个是HttpURLConnection,另一个是Apache HTTP Client。这两个类实现的HTTP请求都支持HTTPS协议,基于流的上传和下载,可配置超时时间,IPv6和连接池。

Apache HTTP Client

DefaultHttpClient和同类的AndroidHttpClient都是可扩展的类。它们有大量且灵活的API,适用于网页浏览器开发。同时它们比较稳定并且bug较少。但是繁多的API的现实下,对其改善与保持兼容性不可得兼,明显Android团队的精力已然不在Apache HTTP Client。

HttpURLConnection

HttpURLConnection是一个通用,轻量的实现,可以满足大多数的程序进行HTTP请求。这个类虽然一开始比较简陋,但是其主要的几个API使得我们更容易进行稳定改善。

连接池污染

在冻酸奶(Android 2.2)之前,HttpURLConnection有着一些烦人的bug。最烦人的就是调用一个可读的InputStream的close方法会污染连接池。我们需要禁用连接池绕开这个问题,如下代码可以禁用连接池。

1 2 3 4 5 6

private void disableConnectionReuseIfNecessary() { // HTTP connection reuse which was buggy pre-froyo if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) { System.setProperty("http.keepAlive", "false"); } }

压缩数据与大小

从2.3开始,我们默认对返回的响应进行了压缩,HttpURLConnection会自动为发出去的请求加上Accept-Encoding: gzip这个头信息。如果gzip压缩的响应有问题,可以通过下面代码禁用gzip。

1

urlConnection.setRequestProperty("Accept-Encoding", "identity");

由于HTTP中的Content-Length头信息返回的是压缩后的大小,所以我们不能使用getContentLength()来计算未压缩数据的大小。正确的做法应该是读取HTTP响应中的字节,直到InputStream.read()方法返回为-1.

HTTPs改进

从Gingerbread开始,增加了对HTTPs链接的优化。在进行HTTPs请求之前,HttpsURLConnection会尝试使用服务器名字指示(Server Name Indication),这种技术可以让多个HTTPs主机共享一个IP地址。在HTTPs请求中,HttpsURLConnection也支持压缩和会话标签(Session Tickets)。一旦连接失败,HttpsURLConnection会不使用上面的三个特性进行重试。这样即可以保证在连接时高效率地连接到最新的服务器,也可以在不破坏兼容性的同时连接到旧服务器。

响应缓存

从4.0开始,HttpURLConnection引入了响应缓存机制。一旦缓存创建,后续的HTTP请求会按照下面情况处理

  • 完全缓存的响应会直接从本地存储中读取,响应很快,不需要网络连接。
  • 有条件的缓存必须由服务端进行freshness验证,比如client发出一个请求,如”Give me /foo.png if it changed since yesterday”,然后服务器端要么返回最新的内容,要么返回304未修改的状态。如果内容不变,则不下载。
  • 没有缓存的响应需要服务器处理,然后这些请求被缓存下来。

对于低于4.0的版本,我们可以使用反射开启响应的缓存机制

1 2 3 4 5 6 7 8 9 10

private void enableHttpResponseCache() { try { long httpCacheSize = 10 * 1024 * 1024; // 10 MiB File httpCacheDir = new File(getCacheDir(), "http"); Class.forName("android.net.http.HttpResponseCache") .getMethod("install", File.class, long.class) .invoke(null, httpCacheDir, httpCacheSize); } catch (Exception httpResponseCacheNotAvailable) { } }

当然,这里还需要服务器端设置HTTP缓存相关的头信息。

哪家强

在2.3之前的版本,Apache的HTTP请求响应实现比较稳定,bug也少,所以在那些版本上它的最好。

但是在2.3之后,毫无疑问,HttpURLConnection是最好的。它API精简实用,默认支持压缩,响应缓存等。最重要的这是Android团队重点投入的,而Apache的版本已经被抛弃了。所以还是使用HttpURLConnection吧。

原文信息

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JvmMultifile 注解在 Kotlin 中的应用

    接触过Kotlin之后,我们会利用其扩展方法特性创建很多便捷的方法来实现更好更快的编码。比如我们对于RxJava进行一些简单的扩展方法实现。

    技术小黑屋
  • 关于改善强迫症的一些方法

    一直以来我都有强迫症,尤其是毕业工作后,明显地感觉更加严重了。经常反复确认水龙头有没有关,锁门后下楼梯,往往又要上来检查一下是否真的锁上。总是担心天然气气有没有...

    技术小黑屋
  • Octopress中处理加网分享问题

    作为一个以内容为中心的网站,在文章结尾增加社会化分享按钮是一种标配,使用Octopress也不例外,本博客选用了加网的社会化分享按钮。开始的时候一切顺利,但是后...

    技术小黑屋
  • Canal 如何保证数据库库事务的一致性

    关系型数据库讲究的是ACID 4个特性,故引入了数据库事务的概念,一个数据库事务中的多条SQL引发的多条数据变更要么全部成功,要么全部失败,即数据的一致性,那同...

    丁威
  • 限定某个目录禁止解析php+限制 user_agent

    限定某个目录禁止解析php : 实例解析: 有这样一种情况,有些站点和论坛是允许上传图片到服务器,但是这就给黑客留下了可进入服务器的大门,他们上传一些php或者...

    老七Linux
  • 基础知识点总结

    //简单实现json到php数组转换功能 private function simple_json_parser($json){ ...

    wangxl
  • VS Code 扩展巡礼-REST Client

    REST Client 是 VS Code 商店的一个 HTTP 访问扩展,官方地址 REST Client[1],用于模拟 HTTP 请求。

    needrunning
  • Mybatis 一二级缓存实现原理与使用指南

    Mybatis 与 Hibernate 一样,支持一二级缓存。一级缓存指的是 Session 级别的缓存,即在一个会话中多次执行同一条 SQL 语句并且参数相同...

    丁威
  • 2016Java面试题与答案——集合专题(一)

    Java集合框架作为Java编程语言的基础,也是Java面试中很重要的一个知识点,不管是学习还是为了入职,这一块都应该被小伙伴们充分重视,老九君列出了一些关于J...

    老九君
  • GA数据解读13—Ad关联GA后,有点击数但users为0?

    今天的问题是:Adwords跟GA关联后,在ADwords报告里面只有部分指标有数据的,如点击和费用是有的,但是用户数没有,这个是什么原因呢?

    GA小站

扫码关注云+社区

领取腾讯云代金券