Android的HTTP Client

Stella981 等级 139 0 0
标签: https

大多数联网类Android apps将使用HTTP来发送和接收数据。Android包含两种HTTP客户端:HttpURLConnection和Apache HTTP Client。它们两者都支持HTTPS,streaming上传和下载,可配置的超时,IPv6和连接池。

Apache HTTP Client

DefaultHttpClient 和它的兄弟AndroidHttpClient是适用于web浏览器的可扩展的HTTP clients。它们具有数量众多且灵活的APIs。它们的实现是稳定的,并具有很少的bugs。

但是这个API的大小使得在不破坏兼容性的情况下提升它变得非常困难。Android团队在Apache HTTP Client上面没有活跃的开发。

HttpURLConnection

是一个通用的,轻量级的HTTP client,它适用于大多数应用。这个类具有简陋的初始版本,但它的集中的API使得我们稳定地提升它比较简单。

在Froyo之前,HttpURLConnection具有一些令人困扰的bugs。特别的,在一个可读的InputStream上调用close()可能会污染连接池。可以通过禁用连接池来绕过这一点:

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");
    }
}

在Gingerbread上,我们添加了透明的响应压缩。HttpURLConnection将会自动地把这个header添加到outgoing requests,并处理对应的响应:

Accept-Encoding: gzip

通过配置你的Web server来压缩响应,以使支持它的客户端能充分利用这一点。如果响应压缩出问题了,class documentation显示了如何禁用它。

由于HTTP的Content-Length header返回了压缩后的大小,因而使用getContentLength()来为加压后的数据确定buffers的大小是不正确的。相反,应该从response中读取bytes,直到InputStream.read()返回-1。

在Gingerbread中,我们也对HTTPS做了一些提升。HttpsURLConnection尝试去连接Server Name Indication (SNI),其允许多个HTTPS主机共享一个IP地址。它也能够启用压缩和session tickets。如果连接失败,它会自动地在没有这些功能的情况下重试。这使得HttpsURLConnection在连接到up-to-date服务器时很高效,而又不会老版本的兼容性。

在Ice Cream Sandwich中,我们添加了一个响应cache。通过安装这个cache,HTTP请求将由三种方式中的一种来满足:

  • 完全缓存的响应直接有本地存储器来提供服务。由于不需要连接网络,这种响应是立即可用的。

  • 有条件地缓存的响应必须具有它们webserver的刷新验证。客户端发送一个诸如“Give me /foo.png if it changed since yesterday”的请求,服务器用更新后的内容或一个304 Not Modified状态来回应。如果内容没有改变,它将不会被下载!

  • 未缓存的响应由web服务器来服务。这些响应稍后会被存入响应缓存中。

使用反射来在支持它的设备上启用HTTP 响应缓存。这段示例代码将会在不影响早期版本的情况下在Ice Cream Sandwich上打开响应缓存:

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) {
    }
}

你也应该配置你的Web服务器来在它的HTTP响应中设置cache headers。

那个client是最好的?

Apache HTTP client在Eclair和Froyo上具有更少的bugs。对于这些版本它是最好的选择。

Gingerbread和更新的版本,HttpURLConnection是最好的选择。它的简单的API和很小的大小使得它很适用于Android。透明的压缩和响应缓存减少了网络使用,提升了速度并节省了电量。新的应用应该使用HttpURLConnection;那也是我们将会耗费大量精力来提升的东西。

译自: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Done.

收藏
评论区

相关推荐

一文搞懂什么是HTTP与HTTPS
(https://blog.csdn.net/petterp/article/details/102779257)Http与Https的区别。 在最近的开发中,深感网络相关基础知识薄弱,于是趁周末好好总结一
HTTPS和HTTP的区别
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。  它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的
HTTP与HTTPS介绍(非原创)
文章大纲 ---- 一、HTTP和HTTPS的基本概念 二、HTTP缺点 三、HTTPS介绍 四、免费HTTPS证书推荐 一、HTTP和HTTPS的基本概念 ----------------- 1. HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的
HTTP协议与HTTPS协议区别
**HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议:**    它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息,它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络
java项目http变更https
1\. 创建 keystore 文件 执行keytool -genkey -v -alias tomcat -keyalg RSA   -validity 3650  -keystore c:\\tomcat.keystore -dname "CN=localhost,OU=cn,O=cn,L=cn,ST=cn,c=cn" -storepass passw
unity 集成sdk后自动打包脚本
set workpath=g:\unity3dwork\zsxd-android\client set unitypath="C:\Program Files (x86)\Unity472\Editor\Unity.exe" set toolpath=D:\adt-bundle-windows-x86_64-20140702\sdk\
Android Http Client如何选择
转个链接 [http://android-developers.blogspot.com/2011/09/androids-http-clients.html?utm\_source=feedburner&utm\_medium=feed&utm\_campaign=Feed%3A+blogspot%2FhsDu+%28Android+Developers
Android的HTTP Client
大多数联网类Android apps将使用HTTP来发送和接收数据。Android包含两种HTTP客户端:HttpURLConnection和Apache HTTP Client。它们两者都支持HTTPS,streaming上传和下载,可配置的超时,IPv6和连接池。 ### Apache HTTP Client [DefaultHttpClient](
Android系统四层架构分享
Android系统四层架构 ------------- 个人网站:[http://www.51pansou.com](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.51pansou.com) Android视频下载:[Android视频](https://www.oschina.
CentOS6配置odbc访问Oracle
安装unixODBC ========== `yum install unixODBC` 安装Oracle odbc client ==================== 到oracle官网下载连接为[http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html](https
ClickHouse 日常记录
### Java Client: 1. clickhouse-jdbc 官方驱动、基于http [https://github.com/ClickHouse/clickhouse-jdbc](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2FClickHouse%
HTTP、HTTPS常用的默认端口号
端口号标识了一个主机上进行通信的不同的应用程序。 1.HTTP协议代理服务器常用端口号:80/8080/3128/8081/9098 2.SOCKS代理协议服务器常用端口号:1080 3.FTP(文件传输)协议代理服务器常用端口号:21 4.Telnet(远程登录)协议代理服务器常用端口号:23 HTTP服务器,默认端口号为80/tcp(木马Exe
Netty HTTP on Android
Netty是一个NIO的客户端服务器框架,它使我们可以快速而简单地开发网络应用程序,比如协议服务器和客户端。它大大简化了网络编程,比如TCP和UDP socket服务器。 “快速而简单”并不意味着开发出来的应用可维护性或性能不好。Netty已经实现了大量的协议,比如FTP,SMTP,HTTP,以及各种基于二进制和文本的传统协议。可以说Netty已经找到了一
Retrofit源码解析(上)
简介 Retrofit是Square公司开发的一款针对Android网络请求的框架,官网地址http://square.github.io/retrofit/ ,在官网上有这样的一句话介绍retrofit,A type-safe HTTP client for Android and Java。我们知道Retrofit底层是基于OKHttp实现的。对ok
TCP、UDP、HTTP、HTTPS之前的区别
网络由下往上分为: 物理层--- 数据链路层--- 网络层 --  IP协议 传输层 --  TCP协议 会话层 -- 表示层和应用层 --  HTTP协议 ![](https://oscimg.oschina.net/oscnet/aeb8a94598094caf8c377e1277ba95948ea.png) 1、TCP/IP连接 TC