22

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

Opera に付属している便利な開発者ツールを使用して、さらに詳しく調べてみましたが、バージョンに不一致はないようで (Java は HTTP 1.1 を使用していると思います)、適切な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

4

5 に答える 5

45

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
于 2010-11-15T15:34:11.007 に答える
8

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

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

コード スニペットは正常に見え、動作するはずです。

よろしく、 ジャーベン・ボールマン

于 2010-09-03T06:57:38.753 に答える
3

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

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のインスタンスです

于 2010-09-02T10:03:55.880 に答える
3

URLクラスの API ドキュメントから:

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

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

于 2011-10-03T21:54:49.303 に答える
2

@posdef私は同じHTTPエラーコード505の問題を抱えていました。Javaコードで使っていたURLをFirefoxに貼り付けたら、Chromeで動きました。しかし、コードを通じてIOExceptionが発生していました。しかし、ついにURL文字列に角かっこ「(」と「)」があることを知りました。それらを削除することで機能したため、ブラウザと同じようにURLエンコーディングが必要だったようです。

于 2013-01-11T07:21:33.923 に答える