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