23

Apache AntGetタスクを使用して、社内の別のチームによって生成されたWSDLのリストを取得しようとしていました。http://.... com:7925 /services/のweblogic9.xサーバーでホストされています。ブラウザからページにアクセスできますが、解析するローカルファイルにページをコピーしようとすると、getタスクでFileNotFoundExceptionが発生します。HTTP用の非標準ポート80がなくても(antタスクを使用して)URLを取得できました。

Antのソースコードを調べて、エラーをURLConnectionに絞り込みました。プロトコルがHTTPとして指定されていても、URLConnectionはデータが標準ポート上にないため、データがHTTPトラフィックであることを認識していないようです。WireSharkを使用してトラフィックをスニッフィングしたところ、ページはネットワーク全体で正しく読み込まれましたが、それでもFileNotFoundExceptionが発生します。

エラーが表示される例を次に示します(無実を保護するためにURLが変更されています)。エラーはconnection.getInputStream();でスローされます。

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

    public class TestGet {
    private static URL source; 
    public static void main(String[] args) {
        doGet();
    }
    public static void doGet() {
            try {
            source = new URL("http", "test.com", 7925,
                    "/services/index.html");
            URLConnection connection = source.openConnection();
            connection.connect();
            InputStream is = connection.getInputStream();
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }

}
4

8 に答える 8

46

HTTPリクエストへの応答がステータスコード404で返され、getInputStream()を呼び出したときにFileNotFoundExceptionが発生しました。それでも応答本文を読みたかったので、別のメソッドHttpURLConnection#getErrorStream()を使用する必要がありました。

getErrorStream()のJavaDocスニペットは次のとおりです。

接続が失敗したが、それでもサーバーが有用なデータを送信した場合は、エラーストリームを返します。典型的な例は、HTTPサーバーが404で応答する場合です。これにより、接続時にFileNotFoundExceptionがスローされますが、サーバーは、何をすべきかについての提案を含むHTMLヘルプページを送信しました。

使用例:

public static String httpGet(String url) {
    HttpURLConnection con = null;
    InputStream is = null;
    try {
        con = (HttpURLConnection) new URL(url).openConnection();
        con.connect();

        //4xx: client error, 5xx: server error. See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.
        boolean isError = con.getResponseCode() >= 400;
        //In HTTP error cases, HttpURLConnection only gives you the input stream via #getErrorStream().
        is = isError ? con.getErrorStream() : con.getInputStream();

        String contentEncoding = con.getContentEncoding() != null ? con.getContentEncoding() : "UTF-8";
        return IOUtils.toString(is, contentEncoding); //Apache Commons IO
    } catch (Exception e) {
        throw new IllegalStateException(e);
    } finally {
        //Note: Closing the InputStream manually may be unnecessary, depending on the implementation of HttpURLConnection#disconnect(). Sun/Oracle's implementation does close it for you in said method.
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                throw new IllegalStateException(e);
            }
        }
        if (con != null) {
            con.disconnect();
        }
    }
}
于 2010-11-09T18:07:37.080 に答える
20

これは古いスレッドですが、同様の問題があり、ここにリストされていない解決策を見つけました。

ブラウザでページを正常に受信していましたが、HttpURLConnectionを介してアクセスしようとすると404が表示されました。アクセスしようとしたURLにポート番号が含まれていました。ポート番号なしで試してみると、HttpURLConnectionを介してダミーページを取得できました。そのため、非標準のポートが問題であるように見えました。

アクセスが制限されていると思い始めましたが、ある意味で制限されていました。私の解決策は、サーバーにUser-Agentを通知する必要があり、必要なファイルの種類も指定することでした。.jsonファイルを読み込もうとしているので、ファイルの種類も必要な仕様かもしれないと思いました。

これらの行を追加すると、最終的に機能しました。

httpConnection.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
httpConnection.setRequestProperty("Accept","*/*");
于 2010-02-16T16:42:42.757 に答える
8

サーバーから返される応答コードを確認してください

于 2009-06-03T03:19:51.100 に答える
2

私はこれが古いスレッドであることを知っていますが、ここのどこにもリストされていない解決策を見つけました。

ポート8080のJ2EEサーブレットからjson形式でデータをプルしようとしましたが、ファイルが見つからないというエラーを受信して​​いました。ポート80で実行されているphpサーバーからこれと同じjsonデータをプルすることができました。

サーブレットでは、doGetをdoPostに変更する必要がありました。

これが誰かに役立つことを願っています。

于 2012-10-10T12:17:41.140 に答える
1

OkHttpを使用できます:

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}
于 2018-07-20T15:20:15.857 に答える
0

同様の問題が発生しましたが、理由が異なるようです。例外トレースは次のとおりです。

java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1
    at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139)
    at com.doitnext.loadmonger.HttpExecution.getBody(HttpExecution.java:85)
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:214)
    at com.doitnext.loadmonger.ClientWorker.run(ClientWorker.java:126)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1434)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:166)
    ... 2 more

したがって、応答コードを取得するだけで、URL接続がcallGetInputStreamになるように見えます。

于 2012-11-30T00:03:37.283 に答える
0

提供されたコードを使用してローカルで試してみましたがFileNotFoundException、サーバーがステータス404応答を返した場合を除いては取得できません。

接続する予定のWebサーバーに接続していることを確認しますか?別のWebサーバーに接続している可能性はありますか?(コードのポート番号がリンクのポート番号と一致しないことに注意してください)

于 2009-06-03T01:58:24.463 に答える
0

私はこれが古いスレッドであることを知っていますが、これに何か気づいたので、それをそこに出すつもりでした。

ジェシカが述べたように、この例外は非標準ポートを使用するときにスローされます。

ただし、DNSを使用している場合にのみ発生するようです。IP番号を使用すると、ポート番号を指定でき、すべて正常に機能します。

于 2013-10-10T08:42:52.370 に答える