2012-01-04 13 views
7

estoy comprobando si Internet está disponible o noURLjava.io.IOException: El servidor devolvió el código de respuesta HTTP: 411 en 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(); 

Mientras se ejecuta este código estoy consiguiendo la excepción

URLjava.io.IOException: Server returned HTTP response code: 411

¿Cuál podría ser el error.

+0

[Podría ayudar] (http://www.checkupdown.com/status/E411.html) –

Respuesta

6

código de estado HTTP 411 significa "longitud requerida" - que ha intentado hacer una petición POST, pero nunca se nos ha facilitado ningún dato de entrada. El código de cliente de Java no está configurando un encabezado Content-Length, y el servidor está rechazando una solicitud POST sin longitud.

¿Por qué estás tratando de hacer una publicación? ¿Por qué no hacer una solicitud GET o, mejor aún, una CABEZA?

También te recomiendo que, si realmente necesitas saber si algún sitio específico está activo (por ejemplo, un servicio web), te conectes a eso, en lugar de solo a Google.

+0

configuré conn.setRequestProperty ("Content-Length", "500000"); aún se produce el mismo error – Arasu

+1

@Arasu: pero aún no está configurando ningún dato, por lo que no me sorprendería si el código del cliente eliminara el encabezado Content-Length. Nuevamente, * ¿por qué * estás tratando de hacer una solicitud POST? –

+0

url del cliente debe ejecutarse solo una vez porque contará para una transacción. A veces, el cliente de Internet puede bajar el nuestro no puede ser.Entonces, tenemos que conectarnos con el cliente solo cuando nuestro Internet está activo – Arasu

2

411 - longitud requerida

El código de estado 411 se produce cuando un servidor se niega a procesar una solicitud porque no se ha especificado una longitud de contenido.

refieren for details

5

intenta agregar las siguientes líneas a su código, que podría ayudar a entender el problema un poco mejor:

conn.setRequestProperty("Content-Length", "0"); 

hacer Compruebe lo que su flujoEntrada de sus Error HTTP 411 estados añadiendo este código:

InputStream is = null; 
if (conn.getResponseCode() != 200) 
{ 
    is = conn.getErrorStream(); 
} 
else 
{ 
    is = conn.getInputStream(); 
} 

Espero que pueda ayudar.

Regards

2

Adición de la línea siguiente en el código donde se realiza poste funcionó:

conn.setRequestProperty("Content-Length", "0"); 
0

de POST/PUT debe ser su uso cuando modificar o crear una nueva instancia en el back-end. Al usar la llamada REST en el formulario en http: ///// {parameter1}/{parameter2} (y así sucesivamente), ¡sin consulta ni envío de cuerpo! aún debe ser una llamada POST si está modificando los datos.

Por lo tanto, en este caso podemos hacer una Reflexión.

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); 
    } 

De esta forma no dañaremos el modelo existente y la llamada se enviará con el encabezado de longitud CERO.

Cuestiones relacionadas