Android HttpURLConnection.getInputStream 在 HTTP POST 中的奇怪行为

Strange behaviour of Android HttpURLConnection.getInputStream in HTTP POST

以下代码将 HTTP POST 转换为 Spring 中的 REST API:

    ...
    HttpURLConnection connection = null;
    InputStream input = null;
    BufferedWriter output = null;
    BufferedReader reader = null;
    String result = null;
    try {
        connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "application/json");
        //Send data
        output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
        output.write(data);
        output.flush();
        //Read response
        int responseCode = connection.getResponseCode();
        if (responseCode >= 400) {
            input = connection.getErrorStream();
        } else {
            input = connection.getInputStream();
        }
        reader = new BufferedReader(new InputStreamReader(input));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append('\n');
        }
        result = "Status " + responseCode + ".\n" + sb.toString();
        ...

其中 url 包含 REST API 端点,数据是 JSON 转换为具有 POST.

中所需的用户属性的字符串

问题是,虽然 POST 按预期工作,但在我获得 HTTP 状态 201 后,我无法获得 API 返回的响应正文(但它在错误的情况下工作,例如 HTTP 状态 409)。奇怪的是 readline() 函数 returns 在第一次读取时总是 null。 API 完美地从 Postman 调用它,甚至 运行 来自 Eclipse.

中的 Java 项目的代码

我的compileSdkversiontargetSdkVersion设置为25。

我将我的代码与网络上的许多 HttpURLConnection 示例进行了比较,到处应用更改,但没有成功...

有什么想法吗?

在比较了从 PostmanAndroid 应用程序发送的 HTTP header 之后,我注意到通过将 header Accept: */* 添加到POST 请求(如 Postman 所做的那样)它按预期工作。根据 HTTP specification没有任何 Accept header 字段的请求意味着用户代理将接受任何媒体类型作为响应。,因此它应该在没有Accept header(就像 GET 一样 API)。

对我来说,这似乎是 Spring API 方面的错误、配置错误或“正常”行为,与 Android [=15 无关=]模块。