web-dev-qa-db-ja.com

java.io.IOException:サーバーがHTTP応答コード505を返す

コードにHTMLベースのクエリがあり、サーバーから505の応答を受信すると、特定の種類のIOExceptionsが発生するようです。私は、同様の問題を抱えていると思われる他の人々と共に505の応答を調べました。どうやら505はHTTPバージョンの不一致を表しているようですが、同じクエリURLを任意のブラウザ(Firefox、Seamonkey、Operaで試したもの)にコピーすると問題はないようです。私が読んだ投稿の1つは、ブラウザがバージョンの不一致の問題を自動的に処理する可能性があることを示唆しています。

Operaに付属しているNice開発者ツールを使用して詳細を調べましたが、バージョンに不一致はないようです(Java HTTP 1.1を使用していると思います)とNice 200 OK応答を受け取りました。同じクエリがJavaコードを通過するときに問題が発生するのはなぜですか?

     private InputStream openURL(String urlName) throws IOException{    
    URL url = new URL(urlName);
    URLConnection urlConnection = url.openConnection();
    return urlConnection.getInputStream();
 }

サンプルリンク:http://www.uniprot.org/uniprot/?query=mnemonic%3aNUGM_HUMAN&format=tab&columns=id,entry%20name,reviewed,organism,length

19
posdef

スペースを含むURLのTomcatでいくつかの問題が発生しました。この問題を解決するには、URLをURLEncoderでエンコードする必要があります。

例(スペースに注意してください):

String url="http://example.org/test test2/index.html";
String encodedURL=Java.net.URLEncoder.encode(url,"UTF-8");
System.out.println(encodedURL); //outputs http%3A%2F%2Fexample.org%2Ftest+test2%2Findex.html
41
user508434

Www.uniprot.orgの開発者として、リクエストログを確認できるという利点があります。昨年のログによると、505応答コードを送信していません。いずれの場合も、サーバーはデフォルトのhttp1.1だけでなくhttp 1リクエストも認識します(ただし、期待した結果が得られない場合があります)。

そのため、途中で何らかのデータの破損があったのではないかと思います。または、ハードウェア障害の影響を受けた場合(最近、スイッチとデータセンター全体で問題が発生しました;)。いずれにせよ、uniprot.orgに関する質問や問題がある場合は、help @ uniprot.orgに連絡してください。問題を解決できるかどうかを確認できます。

コードスニペットは正常なようで、機能するはずです。

よろしく、Jerven Bolleman

8
Jerven

[〜#〜] url [〜#〜] クラスのAPIドキュメントから:

URLクラス自体は、URLコンポーネントをエンコードまたはデコードしません[...]。 URLを呼び出す前にエスケープする必要があるフィールドをエンコードし、URLから返されたエスケープされたフィールドをデコードすることは、呼び出し元の責任です。

したがって、url-strにスペースがある場合は、新しいURL(url-str)を呼び出す前にエンコードしてください

3
Legna

あなたはプロキシの後ろにいますか?このコードは私にとってはうまくいき、ブラウザを通して見た同じテキストを出力します。

final URL url = new URL("http://www.uniprot.org/uniprot/?query=mnemonic%3aNUGM_HUMAN&format=tab&columns=id,entry%20name,reviewed,organism,length");
final URLConnection conn = url.openConnection();
final InputStream is = conn.getInputStream();
System.out.println(IOUtils.toString(is));

connHttpURLConnection のインスタンスです

2
Jon Freedman

@posdef私は同じHTTPエラーコード505の問題を抱えていました。 Javaコードで使用していたURLを貼り付けたとき、Chrome機能しました。しかし、コードを通じてIOExceptionが発生していました。しかし、ついに私は知るようになりましたurl文字列にはブラケット '('と ')'があり、それらを削除することで機能したため、ブラウザーと同じようにURLEncodeを必要とするようです。

2
shreyas