5、URLConnection(1)
URLConnection是一个抽象类,表示指向URL指定资源的活动连接
有两个不同但相关的用途:
1、与URL类相比,他对服务器的交互提供了更多的控制,可以检查服务器发送的首部
并响应地做出响应,可以设置客户端中请求中使用的首部字段,可以用POST、PUT和其他请求方法向服务器发回数据
2、是Java的协议处理器的机制的一部分,这个机制还包括URLStreamHandler
协议处理器的思想:将 处理协议的细节与处理特定数据类型分开,提供相应的用户接口,完成整个WEB浏览器所完成的其他操作
基类java.net.URLConnection是抽象类,要实现一个特定的协议,就要编写一个子类,这些子类可以在运行时由应用程序加载
打开URLConnection
使用URLConnection类的程序遵循以下几个基本步骤:
跳过步骤3:某种URL的默认设置是可以接收的
跳过步骤4:只需要服务器的数据,不关心任何元信息或者协议不提供任何元信息
跳过步骤6:只希望接收服务器数据,而不想服务器发送数据
URLConnection类仅有一个构造函数为保护类型
除非派生URLConnection的子类来处理新的URL类型
否则通过调用URL类的openConnection()方法来创建一个对象
URLConnection类声明为抽象类
必须由子类实现的一个方法是connect()建立与服务器的连接,顾依赖服务类型(HTTP、FTP等)
读取服务器的数据
URLConnection对象从一个URL获取所需要的代码的步骤:
getiInputStream()返回一个通用的InputStream对象可以读取和解析服务器发送的数据
打印结果:
URL和URLConnection之间的不同:
读取首部
HTTP服务器在每个相应前面的首部中都提供了大量信息
HTTP首部可能包括请求文档的内容类型、文档长度、对内容的编码所采用的字符集、日期时间
内容过期时间以及最后修改日期等
具体的信息依赖于服务器
获取指定的首部字段
可以获得请求中特定的常用字段:
1、getContentType()
返回相应主体中的MIME内容类型
依赖于Web服务器发送的一个有效内容类型
如果没有提供内容类型,不会抛异常,返回null
2、getContentLength()
返回内容中有多少字节
如果没有Content-length首部,就会返回-1
这个方法不会抛异常
如果需要准确的知道跑读取的字节数
或者需要预先创建一个足够大的缓冲区来保存数据可以使用这个方法
3、getContentEncoding()
指定内容容是如何编码的
如果发送的内容没有编码就会返回null,不抛异常
Web上最常用的内容编码方式可能是x-gzip
可以使用java.util.zip.GZipInputStream直接解码
4、getDate()
返回一个long
指定文档何时发送,这个时间按格林尼治时间(GMT)1970年1月1日子夜过去了多少毫秒来给出
可以转为java.util.Date
如果HTTP首部不包括Date字段、getDate()返回0
5、getExpiration()
基于服务器的过期时间
指示应合适从缓冲区删除文档
并从服务器重新下载
与getDate()方式类似,区别在于如何解析返回的值
返回一个long,指示自GMT 1970年1月1日子夜12:00后的毫秒数
文档在这一时刻过期
文档中不包含Expiration字段则返回为0
表示文档永久不过期
6、getLastModified()
返回文档最后的修改日期
依旧是GMT....
如果HTTP首部没有包括Last-modified字段返回为0
获取任意首部字段
1、getHeaderField(String name)
返回指定首部字段的值
首部不区分大小写,也不包括结束冒号
可以得到Date、Content-length、Expires首部
只要将name值传入即可
这些方法返回的都是String
2、getHeaderFieldKey(int n)
返回第n个首部字段的键(字段名)
请求方法 本身是第0个首部,它的键位null
第一个首部即编号位1
3、getHeaderField(int n)
返回第n个首部字段的值
4、getHeaderFieldDate(String name,long default)
首先获取由name参数指定的首部字段
然后尝试将这个字符串转换为一个long
指示自GMT........
可以用来获取表示日期的首部字段(Expires、Date、Last-modified首部)
为了将字符串转换为整数
getHeaderFieldDate()使用了java.util.Date的parseDate()方法
parseDate()方法在理解和转换大多数常见日期格式上非常好
如果parseDate()不理解这个日期或者getHeaderFieldDate()无法找到请求所请求的首部字段,就会返回default参数
可以使用java.util.Date类将long转换为String类型
5、getHeaderFieldInt(String name,int default)
这个方法获取首部字段name的值,尝试将其转换为int
失败原因:可能是无法找到锁清秋的首部字段,也可能因为该字段不包含一个可识别的整数,就会返回default默认值