2012-01-04 16 views
7

Sto controllando se internet è disponibile o nonURLjava.io.IOException: Server codice di risposta HTTP restituito: 411 in 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(); 

Durante l'esecuzione di questo codice sto ottenendo l'eccezione

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

Quale potrebbe essere l'errore.

+0

[Might help] (http://www.checkupdown.com/status/E411.html) –

risposta

6

codice di stato HTTP 411 mezzi "di lunghezza necessaria" - hai provato a fare una richiesta POST, ma non hai mai fornito alcun dato di input. Il codice client Java non imposta un'intestazione Content-Length e il server rifiuta una richiesta POST senza lunghezza.

Perché stai anche provando a creare un post? Perché non fare una richiesta GET, o meglio ancora un HEAD?

Vorrei anche consigliare se è davvero necessario sapere se un sito specifico è attivo (ad esempio un servizio Web) a cui ci si collega, piuttosto che solo a Google.

+0

ho impostato conn.setRequestProperty ("Content-Length", "500000"); si verifica ancora lo stesso errore – Arasu

+1

@Arasu: Ma non stai ancora impostando alcun dato, quindi non sarei sorpreso se il codice client rimuovesse l'intestazione Content-Length. Di nuovo, * perché * stai provando a fare una richiesta POST? L'url del client –

+0

deve essere eseguito una sola volta perché conterà su una transazione. A volte il client internet potrebbe non essere il nostro.Quindi dobbiamo connetterci al client solo quando la nostra connessione Internet è attiva – Arasu

2

411 - lunghezza desiderata

Il codice di stato 411 si verifica quando un server si rifiuta di elaborare una richiesta perché una lunghezza di contenuto non è stato specificato.

riferiscono for details

5

tenta di aggiungere le seguenti righe al codice, che potrebbe aiutare a capire il problema un po 'meglio:

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

eseguire controllo che cosa il vostro inputStream dai vostri errore HTTP 411 stati aggiungendo questo codice:

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

Speriamo che possa essere d'aiuto.

saluti

2

aggiungendo la seguente riga del codice in cui viene eseguita dopo lavorato:

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

POST/PUT deve essere utilizzato quando si modifica o la creazione di una nuova istanza sul back-end. Quando si utilizza la chiamata REST nel modulo su http: ///// {parametro1}/{parametro2} (e così via), nessuna query o corpo inviato! ancora dovrebbe essere chiamata POST se modifica i dati.

Quindi, in questo caso possiamo fare un po 'di riflessione.

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

In questo modo non si danneggia il modello esistente e la chiamata verrà inviata con l'intestazione di lunghezza ZERO.

Problemi correlati