2012-01-04 16 views
7
で411

私はこのコードを実行している間に、インターネットは私が例外にURLjava.io.IOException:サーバーは、HTTP応答コードを返しました:JAVA

URLjava.io.IOException: Server returned HTTP response code: 411を取得しています

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

利用可能であるかどうかをチェックしています

エラーが発生する可能性があります。

+0

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

答えて

6

HTTPステータスコード411の手段「に必要な長さ」を参照してください - あなたはPOSTリクエストを作成しようとしたが、あなたはどのような入力データを提供したことがありません。 JavaクライアントコードがContent-Lengthヘッダーを設定しておらず、サーバーが長さのないPOST要求を拒否しています。

なぜあなたは投稿を作成しようとしていますか?なぜ、GETリクエストを作るのではなく、より良いHEADですか?

Googleに接続するのではなく、特定のサイト(ウェブサービスなど)が接続されているかどうかを確認する必要がある場合は、お勧めします。

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

は、このコードを追加してHTTPエラー411の状態からどのようなあなたのInputStreamをチェックしてください:あなたのコードに以下の行を追加する

+0

私はconn.setRequestProperty( "Content-Length"、 "500000")を設定しました。まだ同じエラーが発生します。 – Arasu

+1

@Arasu:しかし、まだデータを設定していないので、クライアントコードがContent-Lengthヘッダを削除していても驚かないでしょう。もう一度、*なぜ*あなたはPOSTリクエストをしようとしていますか? –

+0

クライアントURLはトランザクションにカウントされるため、一度だけ実行する必要があります。時にはクライアントのインターネットがダウンしているかもしれません。だから私たちはインターネットに接続しているときにのみクライアントに接続する必要があります – Arasu

2

411 - サーバーは、コンテンツ長を指定しなかったため、要求を処理することを拒否した場合に411のステータスコード

を必要な長さが発生します。

for details

5

てみ、それはあなたが少し良く問題を理解するのに役立つかもしれません。

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

うまくいけば、うまくいくかもしれません。

よろしくポストが実行されるコードに次の行を追加

2

が働いた:修正またはバックエンドに新しいインスタンスを作成するとき

conn.setRequestProperty("Content-Length", "0"); 
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); 
    } 

このように、既存のモデルには害を及ぼさず、呼び出しはゼロ長のヘッダーで送信されます。