URLjava.io.IOException:服务器在JAVA中返回HTTP响应代码:411

时间:2012-01-04 06:26:12

标签: java

我正在检查互联网是否可用

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

可能是错误。

5 个答案:

答案 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)

411 - 需要长度

当服务器由于未指定内容长度而拒绝处理请求时,会发生411状态代码。

参考for details

答案 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长度标头发送呼叫。