Java网络编程之URI、URL研究专题七
在对openConnection()的调用返回后,调用了connect()方法--用于建立某种资源的连接。(尽管openConnection()方法返回一个连接对象的引用,但是openConnection()不会连接到资源)。 URLConnection的getHeaderFields()方法返回一个对象的应用,该对象的类实现了java.util.Map接口。
该图表(map)包含头部名称和值的集合。什么是头部(header)?头部是基于文本的名称/值对,它识别资源数据的类型、数据的长度等等。
在编译了URLDemo2后,在命令行输入java URLDemo2 http://www.javajeff.com,输出如下:
Date=[Sun, 17 Feb 2002 17:49:32 GMT]
Connection=[Keep-Alive]
Content-Type=[text/html; charset=iso-8859-1]
Accept-Ranges=[bytes]
Content-Length=[7214]
ull=[HTTP/1.1 200 OK]
ETag=["4470e-1c2e-3bf29d5a"]
Keep-Alive=[timeout=15, max=100]
Server=[Apache/1.3.19 (Unix) Debian/GNU]
Last-Modified=[Wed, 14 Nov 2001 16:35:38 GMT]
Input allowed = true
Output allowed = false
上面的输出识别了很多头部(包括Date、null、Content-Length、 Server、Last-Modified等等)和它们的值。输出也显示只允许从资源读取数据。
你对一个程序是如何识别资源数据的是否感到惊奇?仔细看一下前面的输出,你会看到叫做Content-Type的东西。Content-Type是一个头部,它识别了资源数据(内容)的类型是text/html。text部分就是我们所知道的类型,html部分是我们所知道的子类型。
(如果内容是普通的文本,Content-Type的值可能是text/plain。上面的类型表明内容是文本的但不是没有格式的)。Content-Type头部是我们所知道的多用途Internet邮件扩展(MIME)的一部分。
MIME是传统的传输消息的7位ASCII标准的一种扩展。通过引入了多种头部,MIME使视频、声音、图像、不同字符集的文本与7位ASCII结合起来。有了Content-Type,MIME可以识别Content-Length和其它标准的头部。当你使用URLConnection类的时候,你会遇到getContentType()和getContentLength()。这些方法返回的值是Content-Type和Content-Length头部。
你也许听说过HTML窗体(<form>、 </form>)和其它的HTML标记。窗体使我们能够从某种资源得到(GET)数据并按后来的处理把HTML窗体的字段数据发送(POST)到某种资源。你能够使用URLConnection类和MIME模拟可以得到和发送数据的HTML窗体。下面说明你怎样完成这种事务。
假设你想把窗体数据发送(POST)到某个服务器程序。发送需要对窗体数据的操作。首先,窗体的数据必须组织为名称/值对(name/value pair),其次每个对必须指定为name=value格式,再次如果发送多个名称/值对,必须使用 & 符号把每对分开,最后的name内容和value的内容必须使用application/x-www-form-urlencoded MIME类型编码。例如x=y&a=b表现了两个名称/值对--x/y和a/b。
为了辅助编码,Java提供了java.net.URLEncoder类,它声明了一对静态的encode()方法。每个方法有一个String参数并返回包含已编码的参数内容的String对象的引用。例如,如果encode()发现参数中有空格,它在结果中用加号代替空格。
下面的代码片断演示了调用URLEncoder的encode(String s)方法,对a 空格 b字符串进行编码。结果a+b存储在一个新的String对象中,result引用它。
String result = URLEncoder.encode ("a b");
作为准备窗体数据的补充,必须告诉URLConnection对象数据已经被发送了,因为URLConnection默认的操作是获取数据。为了完成这种事务,你可以首先把openConnection()的返回值转换为HttpURLConnection类型(在确保该返回值的类型正确后)。接着调用结果对象的setRequestMethod(String method)方法,把POST作为method参数引用的对象的值。
另一个必须完成的事务是调用URLConnection的setDoOutput(boolean doOutput)方法,其参数的值必须为true。这种事务是必要的,因为URLConnection对象在默认情况下不支持输出。(接着程序最终可以调用URLConnection的getOutputStream()方法,为发送的窗体数据返回一个资源的输出流的引用)。