网络编程(2)——连接父类URLConnection
在前面网络编程(1)中我们了解到如果想要访问其他主机的资源,那么就得知道该资源的URL。那么如果知道了该URL,我们该怎样去访问其主机上的资源呢?本文主要讲清楚Java语言编程的Android网络编程的最基础的父类URLConnectiion,该类是利用URL来实现主机资源的访问,其每个子类的特点都进一步优化并支持新的网络协议,达到从全面到局部,从广泛到精细的系统学习。
java.lang.Object
java.net.URLConnection
URLConnection是网络连接类的超类,它代表应用程序和 URL 之间的通信链接。
其直接子类是:HttpURLConnection, JarURLConnection
HttpURLConnection 是支持HTTP特定功能的URLConnection。这个类是我们是我们最常用的一个网络资源访问类。
还有JarConnection是可用来连接Java文档或者Jar文件的类。
此类的实例可用于读取和写入此 URL 引用的资源。
通常,我们要连接到其他主机的资源需要几个步骤:
1)在 URL 上调用openConnection方法创建连接对象。
<strong>URLConnection conn = url.openConnection();</strong>
注意:构造一个到指定 URL 的 URL 连接,不会创建到 URL 所引用的对象的连接。 也就是说单独只是两端逻辑管道的接通,但没有读写的支持。
2)设置参数和一般请求属性。
比如说我们连接到远程主机之后,我们需要设置一些读取限制等等。比如允不允许资源被读取,要不要使用缓存等等。
一般使用以下方法修改设置参数:setAllowUserInteraction(boolean allowuserinteraction)
允许是否允许用户交互,比如访问后台后启动验证对话框
setDoInput(boolean doinput)
设置输入流,即URL 连接可用于输入和/或输出。将doInput标志设置为true,指示应用程序要从 URL 连接读取数据。默认为ture
setOutInput(boolean dooutput)
设置输出流,即URL 连接可用于输入和/或输出。将doOutput标志设置为true,指示应用程序要将数据写入 URL 连接。默认为flase
setUseCaches(boolean usecaches)
设置是否使用缓存
setConnectTimeout(int timeout)
设置连接超时时间,以毫秒为单位设置一个指定的超时值(以毫秒为单位),该值将在打开到此 URLConnection 引用的资源的通信链接时使用。如果在建立连接之前超时期满,则会引发一个 java.net.SocketTimeoutException。超时时间为零表示无穷大超时。
setReadTimeout(int timeout)设置读取超时时间,以毫秒为单位。setContentHandlerFactory(ContentHandlerFactory fac)
设置应用程序的ContentHandlerFactory.一个应用程序最多只能调用一次该方法。ContentHandlerFactory实例用于根据内容类型构造内容处理程序。
使用以下方法设置请求属性:
setRequestProperty(String key,String value)
设置请求属性。(很常用的方法)
3)使用
connect
方法建立到远程对象的实际连接。
<span style="font-size:14px;"><span style="font-family:SimHei;"><span style="font-weight: normal;">Conn.connect();</span>
</span></span>
注意:URLConnection 对象经历两个阶段:首先创建对象,然后建立连接。步骤(1)只是连接阶段。在(1)和(3)步骤之间可以设置以上参数和属性。
4)操作对应的资源。
在连接后才能进行的操作,此时远程对象变为可用。远程对象的头字段和内容变为可访问。
头字段可以理解为是客户端请求报文和服务端响应报文的配置信息文件,针对内容进行说明和限制的
内容则是客户端和服务端的交互信息主体。
常见的6个头字段访问方法:
public int getContentLength()
返回 content-length头字段的值。
返回说明:此连接的 URL 引用的资源的内容长度,或者如果内容长度未知,则返回 -1。
public String getContentType()
返回 content-type头字段的值。
返回说明:该 URL 引用的资源的内容类型,或者如果类型为未知,则返回 null。
public String getContentEncoding()
返回 content-encoding头字段的值。
返回说明:该 URL 引用的资源的内容编码,或者如果编码为未知,则返回 null。
public long getExpiration()
返回 expires头字段的值。
返回说明:此 URL 引用的资源的期满日期,或者如果为未知,则返回 0。该值为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数
public long getDate()
返回 date头字段的值。
返回说明:该 URL 引用的资源的发送日期,或者如果为未知,则返回 0。返回的值为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数。
public long getLastModified()
返回 last-modified头字段的值。结果为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数。
返回说明:此 URLConnection引用的资源的上次修改日期,或者如果为未知,则返回 0。
public String getHeaderField(String name)(这个方法属于万金油方法,用于获取对应的头字段值,以键值的形式进行)
返回指定的头字段的值。
如果调用的连接多次使用不同的值设置了头字段,则只返回最后一次设置的值。
参数 name- 头字段的名称。
返回说明:指定的头字段的值,或者如果头中没有这样一个字段,则返回 null。
public Map<String,List<String>> getHeaderFields()
返回 头字段的不可修改的 Map。Map 键是表示 response-header 字段名称的 String。每个 Map 值为一个不可修改的 String 的列表,它们代表相应的字段值。
返回说明:头字段的 Map
API还有更多关于获取头字段的方法,如果有需要可以在博文开头下载API参考。
常见访问内容方法:
public Object getContent() throws IOException
用于获取此 URL 连接的内容。
此方法首先通过调用getContentType方法确定对象的内容类型。如果这是该应用程序第一次遇到的特定内容类型,则会创建适用于该类型的内容处理程序:
如果该应用程序已使用setContentHandlerFactory方法建立了内容处理程序工厂实例,则调用此实例的creatContentHandler方法,内容类型为其中的一个参数;结果为该内容类型的内容处理程序。 如果尚未建立任何内容处理程序工厂,或者如果工厂的
creatContentHandler方法返回 null,则应用程序会加载以下名称的类: sun.net.www.content.<contentType>其中,<contentType> 取自 content-type 字符串,将所有的斜杠字符用句点 (‘.‘)替换,所有其他非字母数字字符用下划线 ‘_‘替换。字母数字字符特指 26 个大写 ASCII 字母 ‘A‘ 到 ‘Z‘,26 个小写 ASCII 字母 ‘a‘ 到 ‘z‘以及 10 个 ASCII 数字 ‘0‘ 到 ‘9‘。如果指定的类不存在,或者不是 ContentHandler 的子类,则抛出一个 UnknownServiceException。
返回说明:获取的对象。应使用instanceof运算符来确定返回的对象的具体类型。
public Object getContent(Class[] classes)throws IOException
获取此 URL 连接的内容。
参数:Class[]- 指示请求的类型的 Class 数组
返回说明:获取的第一个与类数组中指定的类型相匹配的对象。如果请求的类型都不支持,则返回 null。应使用 instanceof 运算符来确定返回的对象的具体类型。
public InputStream getInputStream() throws IOException
返回从此打开的连接读取的输入流。 在读取返回的输入流时,如果在数据可供读取之前达到读入超时时间,则会抛出 SocketTimeoutException。
返回说明:从此打开的连接读入的输入流。
public OutputStream getOutputStream() throws IOException
返回写入到此连接的输出流。
返回说明:写入到此连接的输出流。
这个类比较重要,虽然后期开发android使用的是它的HTTP子类,可是对于加深被高度分装的子类的理解来说,这个类的掌握是必须的。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。