使用URIConnection获取信息
如果想从某个Web资源获取更多信息,那么应该使用URLConnection类,它能得到比基本的URL类更多的控制功能。
使用URLConnection类的步骤如下
调用URL类中的openConnection方法获得URLConnection对象
1
URLConnection connection=url.openConnection();
使用以下方法来设置任意的请求属性
1
2
3
4
5
6
7
8setDoInput
setDoOutput
setIfModifiedSince
setUseCaches//用于命令浏览器首先检查它的缓存
setAllowUserInteraction//用于在访问有密码保护的资源时弹出对话框,以便查询用户名和口令
setRequestProperty
setConnectTimeout
setReadTimeout
调用connect方法连接远程资源并获取响应头信息
1
connection.connect();
与服务器建立连接后,你可以查询头信息。getHeaderFieldKey和getHeaderField两个方法列举了消息头的所有字段。getHeaderFields方法返回一个包含了消息头中所有字段的标准Map对象。为了方便使用,以下方法可以查询各标准字段
1
2
3
4
5
6getContentType
getContentLength
getContentEncoding
getDate
getExpiration
getLastModified最后,访问资源数据。使用getInputStream方法获取一个输入流用以读入信息(这个输入流与URL类中的openStream方法返回的流相同)。
下面详细介绍一下URLConnection类中的一些方法。有几个方法可以在与服务器建立连接之前设置连接属性,其中最重要的是setDoInput和setDoOutput。在默认情况下建立的连接只有从服务器读取信息的输入流,并没有任何执行写操作的输出流。如果想获得输出流(例如,向一个Web服务器提交数据),那么可以调用:
1 | connection.setDoOutput |
下面也可以设置请求头。请求头是与请求命令一起被发送到服务器的
1 | GET www.server.com/index.html HTTP/1.0 |
setIfModifiedSince方法用于告诉连接你只对某个特定日期以来被修改过的数据感兴趣;setUseCaches和setAllowUserInteraction这两个方法只作用于Applet;
还有一个总揽全局的方法:setRequestProperty,它可以用来设置对特定协议起作用的任何“名值对”
如果你想访问一个有保护的Web页,可以按照以下步骤操作
将用户名、冒号和口令以字符串形式连接在一起
1
String input=username+":"+password;
计算上一步所得字符串的base64编码。(base64编码用于将字节流编码成可打印的ASCII字符流。)
1
String encoding = base64Encode(input);
调用setRequestProperty方法,设置name参数的值为”Authorization”,value参数的值为“Base”+encoding:
1
connection.setRequestProperty("Authorization","Basic "+encoding);
一旦调用了connect方法,就可以查询响应头字段
1 | String key=connection.getHeaderFieldKey(n); |
getHeadreFields方法可以返回一个封装了响应头字段的Map对象
1 | Map<String,List<String>> headerFields=connection.getHeaderFields(); |
HTTP响应头举例
1 | Date: Wed,27 Aug 2008 00:15:48 GMT |
java提供了六个访问响应头的常用方法
键名 | 方法名 | 返回类型 |
---|---|---|
Date | getDate | long |
Expires | getExpiration | long |
Last-Modified | getLastModified | long |
Content-length | getContentLength | int |
Content-Type | getContentType | String |
Content-Encoding | getContentEncoding | String |
示例程序如下
1 | import java.io.*; |