任何人都可以解释以下内容:
package com.foo.bar;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import org.springframework.util.FileCopyUtils;
public class ATest {
public static void main(String[] args) throws Exception {
try {
final String payload = "{\"parentExecutor\":\"foo1233\"}";
URL url = new URL("http://localhost/notes");
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Content-Type", "application/json");
FileCopyUtils.copy(payload.getBytes(), connection.getOutputStream());
connection.connect();
final InputStream is = connection.getInputStream();
int b = is.read();
String result = "";
while (b != -1) {
result += (char) b;
b = is.read();
}
System.out.println(connection.getResponseCode());
System.out.println(result);
is.close();
}
catch (final ProtocolException e) {
e.printStackTrace();
}
}
}
上面的示例抛出以下异常:
java.net.ProtocolException: cannot write to a URLConnection if doOutput=false - call setDoOutput(true)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:995)
at com.foo.bar.ATest.main(ATest.java:24)
但是,如果我添加一个电话设置DoOutput(真),抛出以下异常:
java.net.ProtocolException: HTTP method DELETE doesn't support output
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1004)
at com.foo.bar.ATest.main(ATest.java:25)
然后,如果我更改协议http to https没有抛出异常,我从服务器返回了预期的响应代码和内容。我查看了源代码,可以跟踪调用并跟踪异常发生的位置,但为什么通过 HTTPS 发出这样的请求就可以,而不是通过 HTTP?
这是一个限制(我认为这是一个错误或至少是一个愚蠢的功能)HttpURLConnection
。你至少是不是唯一的一个 https://www.google.com/search?q=%22java.net.ProtocolException%3a%20HTTP%20method%20DELETE%20doesn%27t%20support%20output%22谁在使用 REST Web 服务处理时遇到过这种情况URLConnection
.
考虑使用Apache HttpComponents 客户端 http://hc.apache.org/httpcomponents-client-ga/反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)