Java网络编程之URI、URL研究专题八
列表6是URLDemo3的源代码,它演示了把窗体数据发送给某个"了解"application/x-www-form-urlencoded内容类型的资源。它实现了前面提到的各种事务。
列表6: URLDemo3.java
// URLDemo3.java
import java.io.*;
import java.net.*;
class URLDemo3
{
ublic static void main (String [] args) throws IOException
{
// 检查最后两个参数和参数的数量
if (args.length < 2 || args.length % 2 != 0)
{
System.err.println ("usage: java URLDemo3 name value " +
"[name value ...]");
return;
}
// 建立程序连接服务器程序资源的URL对象,它返回一个窗体的名称/值对
URL url;
url = new URL
("http://banshee.cs.uow.edu.au:2000/~nabg/echo.cgi");
// 向某个特定协议对象返回表现http资源连接的引用
URLConnection uc = url.openConnection ();
// 验证连接的类型,必须是HttpURLConnection的
if (!(uc instanceof HttpURLConnection))
{
System.err.println ("Wrong connection type");
return;
}
// 表明程序必须把名称/值对输出到服务器程序资源
uc.setDoOutput (true);
// 表明只能返回有用的信息
uc.setUseCaches (false);
//设置Content-Type头部指示指定URL已编码数据的窗体MIME类型
uc.setRequestProperty ("Content-Type",
"application/x-www-form-urlencoded");
// 建立名称/值对内容发送给服务器
String content = buildContent (args);
//设置Content-Type头部指示指定URL已编码数据的窗体MIME类型
uc.setRequestProperty ("Content-Length",
"" + content.length ());
// 提取连接的适当的类型
HttpURLConnection hc = (HttpURLConnection) uc;
// 把HTTP请求方法设置为POST(默认的是GET)
hc.setRequestMethod ("POST");
// 输出内容
OutputStream os = uc.getOutputStream ();
DataOutputStream dos = new DataOutputStream (os);
dos.writeBytes (content);
dos.flush ();
dos.close ();
// 从服务器程序资源输入和显示内容
InputStream is = uc.getInputStream ();
int ch;
while ((ch = is.read ()) != -1)
System.out.print ((char) ch);
is.close ();
}
tatic String buildContent (String [] args)
{
StringBuffer sb = new StringBuffer ();
for (int i = 0; i < args.length; i++)
{
// 为正确的传输对参数编码
String encodedItem = URLEncoder.encode (args [i]);
.append (encodedItem);
if (i % 2 == 0)
.append ("="); // 分离名称和值
else
.append ("&"); // 分离名称/值对
}
// 删除最后的 & 间隔符
.setLength (sb.length () - 1);
return sb.toString ();
}
}
你可以会奇怪为什么URLDemo3没有调用URLConnection的connect()的方法。这个方法没有被明显的调用,因为如果连向资源的连接没有建立的话,其它的URLConnection方法(例如getContentLength())会明确的调用connect()方法。但是一旦连建立了接,调用这些方法(例如setDoOutput(boolean doOutput))就是违反规定的。
在connect()被(明确地或隐含地)调用后,这些方法会产生一个IllegalStateException对象。
在URLDemo3编译后,在命令行输入java URLDemo3 name1 value1 name2 value2 name3 value3,你可以看到下面的输出:
<html> <head>
<title>Echoing your name value pairs</title>
</head>
<body>
<ol>
<li>name1 : value1
<li>name2 : value2
<li>name3 : value3
</ol>
<hr>
Mon Feb 18 08:58:45 2002
</body>
</html>
该服务器程序资源的输出由HTML组成,这些HTML回应的是name1、value1、name2、 value2、name3和value3。
技巧
如果你需要URL对象的URL的字符串表现形式,请调用toExternalForm()或toString()。两种方法的功能是相同的。
总结
本文研究了Java的网络API,聚焦于URI、URL和URN。你学习了这些概念,以及怎样使用URI和URL(URL相关)的类工作,同时你学习了MIME的知识以及它与URL的关系。现在你应该编写一些代码熟悉一下所学的内容了。