当前位置: 首页 > 面试题库 >

为什么必须调用URLConnection#getInputStream才能写出URLConnection#getOutputStream?

澹台蕴藉
2023-03-14
问题内容

我正在尝试写入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(无论是好是坏)都是为用户设计的,使其遵循一系列非常特定的事件:

  1. 设置请求属性
  2. (可选)getOutputStream(),写入流,关闭流
  3. getInputStream(),从流中读取,关闭流

如果您的请求是POST或PUT,则需要可选步骤#2。

据我所知,OutputStream不像套接字,它不直接连接到服务器上的InputStream。相反,在关闭或刷新流并调用getInputStream()之后,您的输出将内置到Request中并发送。语义基于您将要读取响应的假设。我所看到的每个示例都显示了事件的顺序。我肯定会与您和其他人一样,与常规流I
/ O API相比,此API是违反直觉的。

您链接到的教程指出“
URLConnection是一个以HTTP为中心的类”。我的解释是,这些方法是围绕“请求-响应”模型设计的,并假设它们将被使用。

对于它的价值,我发现此错误报告比Javadoc文档更好地解释了类的预期操作。该报告的评估指出“发送请求的唯一方法是调用getInputStream。”



 类似资料:
  • 问题内容: 我有curl命令: 我想在Java API中创建HTTP请求,该操作将执行相同的操作。可以在本README中找到该curl命令。它用于开始在RabbitMQ上记录日志。回应并不重要。 现在,我创建了这样的内容(我删除了不太重要的行,例如捕获了异常等),但是不幸的是,它不起作用: 完整代码 问题答案: 这是最终的解决方案:

  • 主要内容:1 什么是Java URLConnection,2 如何获取URLConnection对象,3 Java URLConnection的例子1 什么是Java URLConnection Java的的URLConnection类表示URL和应用程序之间的通信链路。此类可用于读写数据到URL引用的指定资源。 2 如何获取URLConnection对象 3 Java URLConnection的例子 Java URLConnection类提供了许多方法,我们可以使用getInputStrea

  • logcat中没有错误,只是一堆警告。以下是logcat: 记录了最后一个log.i,但字符串“%s”为空。有什么想法吗?

  • 问题内容: 每个人都告诉我“使用super.viewDidLoad()因为它就是这样”或“我一直那样做,所以要保留它”,“如果不叫super就是错误的”等。 我只发现了一些有关Objective-C用例的主题,这些主题并没有那么启发性,但是我正在Swift 3中进行开发,所以有什么专家可以给我一个很好的详细解释吗? 这是一种良好实践的案例还是有任何隐藏的影响? 问题答案: 通常,最好为您覆盖的所有

  • 问题内容: 可以说我正在与Web服务器进行HTTP通讯,并且我将接受html或文本,但更喜欢html。换句话说,标题应该说(我认为!) 接受:text / html,text / * 我正在使用Java,所以我有一个URLConnection。我应该使用: 要么 还是等价的??? 通常,我看到的大多数第三方代码似乎都不必担心这些标头的顺序或多个值,因此我想知道它最终如何工作。 问题答案: 第一个代

  • 一般来说,我看到的大多数第三方代码似乎并不太担心这些头的排序或多个值,所以我想知道它最终是如何工作的。