Joh*_*ohn 32 java httpurlconnection
我试着写出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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
rob*_*x44 41
URLConnection和HttpURLConnection的API(为更好或更差)设计用于用户遵循非常特定的事件序列:
如果您的请求是POST或PUT,则需要选择步骤#2.
据我所知,OutputStream不像套接字,它不直接连接到服务器上的InputStream.相反,在关闭或刷新流之后,AND调用getInputStream(),您的输出将内置到Request中并发送.语义基于您希望读取响应的假设.我见过的每个例子都显示了这种事件的顺序.我肯定会同意你和其他人的说法,与普通的流I/O API相比,这个API是违反直觉的.
您链接到的教程指出"URLConnection是一个以HTTP为中心的类".我将其解释为表示方法是围绕请求 - 响应模型设计的,并假设它们将如何使用.
对于它的价值,我发现这个错误报告比javadoc文档更好地解释了该类的预期操作.对报告的评估指出"发出请求的唯一方法是调用getInputStream."