我正在尝试写出 URLConnection#getOutputStream
,但是,直到我调用 URLConnection#getInputStream
为止,实际上没有数据发送。即使我将 URLConnnection#doInput
设置为false,也仍然不会发送。有人知道为什么是这样吗? API文档中没有任何内容对此进行描述。
URLConnection上的Java API文档:http://download.oracle.com/javase/6/docs/api/java/net/URLConnection.html
Java的关于读取和写入URLConnection的教程:http://download.oracle.com/javase/tutorial/networking/urls/readingWriting.html
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
public class UrlConnectionTest {
private static final String TEST_URL = "http://localhost:3000/test/hitme";
public static void main(String[] args) throws IOException {
URLConnection urlCon = null;
URL url = null;
OutputStreamWriter osw = null;
try {
url = new URL(TEST_URL);
urlCon = url.openConnection();
urlCon.setDoOutput(true);
urlCon.setRequestProperty("Content-Type", "text/plain");
////////////////////////////////////////
// SETTING THIS TO FALSE DOES NOTHING //
////////////////////////////////////////
// urlCon.setDoInput(false);
osw = new OutputStreamWriter(urlCon.getOutputStream());
osw.write("HELLO WORLD");
osw.flush();
/////////////////////////////////////////////////
// MUST CALL THIS OTHERWISE WILL NOT WRITE OUT //
/////////////////////////////////////////////////
urlCon.getInputStream();
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// If getInputStream is called while doInput=false, the following exception is thrown: //
// java.net.ProtocolException: Cannot read from URLConnection if doInput=false (call setDoInput(true)) //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
} catch (Exception e) {
e.printStackTrace();
} finally {
if (osw != null) {
osw.close();
}
}
}
}
最佳答案
用于URLConnection和HttpURLConnection的API(无论是好是坏)都是为用户设计的,以使其遵循特定的事件序列:
如果您的请求是POST或PUT,则需要可选步骤#2。
据我所知,OutputStream不像套接字,它不直接连接到服务器上的InputStream。相反,在关闭或刷新流并调用getInputStream()之后,您的输出将内置到Request中并发送。语义基于您将要读取响应的假设。我所看到的每个示例都显示了事件的顺序。我当然同意您和其他人的看法,与常规流I/O API相比,此API是违反直觉的。
您链接到的tutorial指出“URLConnection是一个以HTTP为中心的类”。我的解释是,这些方法是围绕“请求-响应”模型设计的,并假设它们将被使用。
对于它的值(value),我发现这个bug report比Javadoc文档更好地解释了类的预期操作。该报告的评估指出“发送请求的唯一方法是调用getInputStream。”