我正在检查互联网是否可用
URL url = new URL("http://www.google.co.in/");
final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// set connect timeout.
conn.setConnectTimeout(1000000);
// set read timeout.
conn.setReadTimeout(1000000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type","text/xml");
conn.setDoOutput(true);
conn.connect();
Integer code = conn.getResponseCode();
final String contentType = conn.getContentType();
运行此代码时,我得到了异常
URLjava.io.IOException: Server returned HTTP response code: 411
可能是错误。
答案 0 :(得分:6)
HTTP状态代码411表示“需要的长度” - 您尝试发出POST请求,但您从未提供任何输入数据。 Java客户端代码未设置Content-Length标头,服务器拒绝没有长度的POST请求。
为什么你甚至试图发帖?为什么不提出GET请求,或者更好的是HEAD?
我还建议您,如果您确实需要知道某个特定网站是否已启动(例如网络服务),而您只是连接到该网站。
答案 1 :(得分:5)
尝试在代码中添加以下行,这可能会帮助您更好地理解问题:
conn.setRequestProperty("Content-Length", "0");
通过添加以下代码,检查 HTTP ERROR 411 状态中的inputStream:
InputStream is = null;
if (conn.getResponseCode() != 200)
{
is = conn.getErrorStream();
}
else
{
is = conn.getInputStream();
}
希望这可能有所帮助。
问候
答案 2 :(得分:2)
答案 3 :(得分:2)
在执行发布的代码中添加以下行:
conn.setRequestProperty("Content-Length", "0");
答案 4 :(得分:0)
在后端修改或创建新实例时应使用POST / PUT。 在http:///// {parameter1} / {parameter2}(等等)的表单中使用REST调用时,没有查询或正文发送!如果修改数据,它仍然应该是POST调用。
所以,在这种情况下,我们可以做一些反思。
String urlParameters = url.getQuery();
if (urlParameters == null) urlParameters = "";
byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);
int postDataLength = postData.length;
if (postDataLength > 0) {
//in case that the content is not empty
conn.setRequestProperty("Content-Length", Integer.toString(postDataLength));
} else {
// Reflaction the HttpURLConnectioninstance
Class<?> conRef = conn.getClass();
// Fetch the [requests] field, Type of MessageHeader
Field requestsField= conRef .getDeclaredField("requests");
// The [requests] field is private, so we need to allow accessibility
requestsField.setAccessible(true);
MessageHeader messageHeader = (MessageHeader) requestsField.get(conn);
// Place the "Content-Length" header with "0" value
messageHeader.add("Content-Length", "0");
// Inject the modified headers
requestsField.set(conn, messageHeader);
}
通过这种方式,我们不会损害现有模型,并且将使用ZERO长度标头发送呼叫。