Android官方API翻译——HttpURLConnection

人工翻译,水平有限,欢迎指正交流

原文地址:http://developer.android.com/reference/java/net/HttpURLConnection.html

-------------------------------------------------------------------

继承自java.net.URLConnection

适用于HTTP(RFC 2616)的URLConnection,用于在网络上发送和接受数据。这个类可以用来发送或者接受那些事先不知道长度的流式数据。

可以采用如下方式使用这个类:

1.通过调用URL.openConnection()方法,再执行强制类型转换获取HttpURLConnection实例。

2.准备请求。一个网络请求的主要组成部分就是URI,请求头也可能包含凭证、首选内容类型、Session Cookies等数据。

3.请求体是可选的上传内容,一个HttpURLConnection对象要想携带请求体必须设置setDoOutput(true)。通过写入getOutputStream()返回的流来传输数据。

4.读取响应。响应数据的头部通常包含有例如数据内容类型、长度、修改日期以及Session Cookies等元数据。响应数据可以通过getInputStream()返回的流来读取。如果没有响应数据,这个方法会返回一个空的流。

5.断开连接。一旦返回的数据读取完毕,HttpURLConnection应该通过调用disconnect()被关闭。断开连接会释放连接使用的资源,以使这些资源被关闭或回收。

例如,获取http://www.android.com/的网页数据代码如下:

1 URL url = new URL("http://www.android.com/");
2    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
3    try {
4      InputStream in = new BufferedInputStream(urlConnection.getInputStream());
5      readStream(in);
6     finally {
7      urlConnection.disconnect();
8    }
9  }

HTTPS安全通信

调用openConnection()时如果URL前缀是https可以获得一个HttpsURLConnection实例,可以重写默认的HostnameVerifier和SSLSocketFactory。一个应用程序提供的从SSLConext创建出的SSLSocketFactory可以提供一个自定义用于验证证书链的X509TrustManager和一个自定义用于提供终端证书的X509KeyManager。详细内容会在HttpsURLConnection中介绍。

处理响应

HttpURLConnection至多会支持五次HTTP重定向,能够跟随重定向从一个原始服务器指向另一个服务器。但是不支持从HTTPS到HTTP的重定向,反之亦然。

如果HTTP响应显示发生错误,getInputStream()会抛出IOException异常。通过getErrorStream()可以读取错误信息。头部数据通常可以通过getHeaderFields()读取。

发送数据

要上传数据到web服务器,需要通过setDoOutput(true)将connection设置为用于输出。

为了达到最佳的性能,你应该:

如果数据长度已知,设置setFixedLengthStreamingMode(int)

如果数据长度未知,设置setChunkStramingMode(int)

否则,HttpURLConnection会强制在传输数据前将整个请求体缓存于内存中,浪费(或有可能耗尽)堆空间并且增大延迟。

上传数据的示例代码如下:

 1 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
 2    try {
 3      urlConnection.setDoOutput(true);
 4      urlConnection.setChunkedStreamingMode(0);
 5
 6      OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
 7      writeStream(out);
 8
 9      InputStream in = new BufferedInputStream(urlConnection.getInputStream());
10      readStream(in);
11     finally {
12      urlConnection.disconnect();
13    }
14  }

性能

通过本类获取的输入和输出流不会被缓存。大多数调用时都应该通过BufferedInputStream或BufferedOutputStream来封装返回的原始流。批量读取或写入的调用或可忽略缓存。

当与服务器有大量数据传输时,应使用流来限制内存中同一时间内数据量。除非你需要一次性将所有数据存入内存,将其按照一整个流来处理(而不是将数据视为byte或字符串数组来排序)。

为了减少延迟,HttpURLConnection可以在处理多种请求/响应时使用相同的底层Socket。这导致的结果就是HTTP连接的开启时间可能会比需要的更长。调用disconnect()可能将这个socket返回至一个存有已连接Socket的池中。为了避免这种现象,可以在发出任何HTTP请求前将系统属性http.keepAlive设置为false。http.maxConnections可以用来控制针对每一个服务器会有多少闲置连接被保持。

默认情况下,HttpURLConnection的这种实现会要求服务器使用gzip压缩。所以,虽然getContentLength()能够返回传输的比特数,但你不应依赖这个方法来预计从getInputStream()可以获得的字节数。相反地,你应该一直从流中读取数据直到读完为止,也就是当read()返回-1时。Gzip压缩可以在请求头部的accept encoding出进行设置以禁用:

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

处理网络登录

有些Wi-Fi网络需要用户登录才能提供正常服务。此类登录页面通常通过HTTP重定向实现。你可以通过getURL()来测试你的连接是否被异常重定向。在请求的头部数据被接收到之前,这个方法是无效的,你可以通过getHeaderFields()或getInputStream()来触发头部数据被接收的操作。

下面是一段检测请求是否被重定向至其他主机的代码:

 1 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
 2    try {
 3      InputStream in = new BufferedInputStream(urlConnection.getInputStream());
 4      if (!url.getHost().equals(urlConnection.getURL().getHost())) {
 5        // we were redirected! Kick the user out to the browser to sign on?
 6
 7      ...
 8    } finally {
 9      urlConnection.disconnect();
10    }
11  }

HTTP认证

HttpURLConnection支持Http基础认证。使用Authenticator来设置VM级的认证处理器:

   Authenticator.setDefault(new Authenticator() {
     protected PasswordAuthentication getPasswordAuthentication() {
       return new PasswordAuthentication(username, password.toCharArray());

   });
 }

除非与HTTPS搭配使用,这并不是一种安全的用户认证机制。特别需要注意的是,通过网络传输的用户名、密码、请求数据和响应数据都是未加密的。

-未完待续

时间: 2024-09-30 14:29:11

Android官方API翻译——HttpURLConnection的相关文章

Android官方文章翻译之管理设备苏醒状态(Managing Device Awake State)

这几个月一直在学习iOS开发,把Android放在一旁耽搁了很久,是时候温故而知新了. 说点篇外话,这几天在看Developer的官方文档,关于Material Design又了解了一下. Material早在2014年的GoogleIO大会就已经被谷歌推出了,但是市场上采用这种新的设计方案的APP确是少之又少,国外倒是跟进的很快,国内几乎没有任何进展,纵观国内各大公司的移动APP,很少会“与时俱进”的采用Google推出的新系统的设计方案. 不过这原因由来已久了,因为安卓系统的版本分布太过零散

DOJO官方API翻译或解读-dojo/store (自定制存储器)

dojo/store 是对已存数据的访问和存储的统一接口,dojo/store意图以一个简单.易于使用和扩展的API来,替代.集合和改善 dojo/data 和dojox/storage .基于HTML5/W3C’s IndexedDB object store API. 原先的dojox/storage 已经被Dojo object store Api兼容. API Methods 该API下所有的方法都是可选的,所有的方法都会返回一个promise.(部分在w3c的object store

DOJO官方API翻译或解读-dojo/_base/lang --hitch()

hitch() hitch() 是一个函数,会在给定的上下中执行给定一个执行函数.hitch允许你去控制一个函数如何执行,往往在异步操作中起作用. 我们常常会写出这样的代码:(博主:这个代码意图在"click"事件触发时,执行此时定义的"processEvent".) 1 require(["dojo/on"], function(on){ 2 var processEvent = function(e){ 3 this.something =

Android官方技术文档翻译——Gradle 插件用户指南(4)

近期赶项目,白天基本没时间,仅仅有晚上在家的时候才干看一看.昨天晚上仅仅翻译完了第四章,今天就仅仅发第四章吧. 本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide. 翻译不易.转载请注明CSDN博客上的出处: http://blog.csdn.net/maosidiaoxian/article/details/4195580

如何看待 Kotlin 成为 Android 官方支持开发语言?

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 如何看待 Kotlin 成为 Android 官方支持开发语言? - Thinkblog - 博客频道 - CSDN.NET Thinkblog 爱编程,爱分享,不仅限于技术. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]

如何看待 Kotlin 成为 Android 官方支持开发语言

Google IO 2017宣布了 Kotlin 会成为 Android 官方开发语言.一时间朋友圈和Android圈被各种刷屏.当然我也顺势而为发布了一篇的文章<为什么我要改用Kotlin>,着实狠狠地蹭了一波热度(尽管这样会被鄙视).眼下Android圈已经躁动了,甚至严重到如果对Kotlin视而不见就显得自己不像一个合格的Android程序员. 本文尝试从一个客观全面一点儿的角度来看待这件事情,尽力为大家提供一个比较理性的观点供参考. 为什么会选用Kotlin 关于 Google 为什么

Android官方开发文档Training系列课程中文版:目录

原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻译成英文,供国内的开发者使用,尤其是入门开发者,虽然现在网络上有很多入门课程,但是还是依靠官方文档学习来的靠谱,安卓官方文档是一系列的课程,使每个人可以系统的掌握安卓的知识,相比其它课程来说,它为开发者提供了查缺补漏的功能. 在这里你可以领略到安卓开发世界的精彩. Tips : 同时,本目录可以作为

国内值得关注的官方API集合

项目地址:https://github.com/marktony/Awesome_API 本页仅收集国内部分官方API,如需查看其他版本,请点击这里. 目录 笔记 出行 词典 电商 地图 电影 后端云 即时通讯 开发者网站 快递查询 旅游 社交 视频 天气 图片与图像处理 外卖 消息推送 音乐 云 语音识别 综合 笔记 为知笔记 - 为知笔记Windows客户端开放了大量的API,其中绝大部分,都通过COM提供,可以在javascript, C#, C++, Delphi等语言中使用.接口通过I

Android官方入门文档[1]创建一个Android项目

Android官方入门文档[1]创建一个Android项目 创建一个Android项目 这节课教你1.创建与Android Studio中的一个项目2.创建使用命令行工具项目 你也应该阅读?管理项目 Creating an Android Project This lesson teaches you to1.Create a Project with Android Studio2.Create a Project with Command Line Tools You should also