117

HttpURLConnection を使用して URL に投稿リクエストを送信しようとしています (Java で cUrl を使用するため)。リクエストの内容は xml で、アプリケーションはエンドポイントで xml を処理し、レコードをデータベースに保存してから、xml 文字列の形式でレスポンスを返します。アプリはローカルの apache-tomcat でホストされています。

ターミナルからこのコードを実行すると、期待どおりに行がデータベースに追加されます。ただし、接続から InputStream を取得しているときに、次のように例外がスローされます

java.io.FileNotFoundException: http://localhost:8080/myapp/service/generate
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401)
    at org.kodeplay.helloworld.HttpCurl.main(HttpCurl.java:30)

ここにコードがあります

public class HttpCurl {
    public static void main(String [] args) {

        HttpURLConnection con;

        try {
            con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);

            File xmlFile = new File("test.xml");

            String xml = ReadWriteTextFile.getContents(xmlFile);                

            con.getOutputStream().write(xml.getBytes("UTF-8"));
            InputStream response = con.getInputStream();

            BufferedReader reader = new BufferedReader(new InputStreamReader(response));
            for (String line ; (line = reader.readLine()) != null;) {
                System.out.println(line);
            }
            reader.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  }

例外が行にトレースさInputStream response = con.getInputStream();れ、FileNotFoundException に関連するファイルがないように見えるため、混乱します。

xml ファイルへの接続を直接開こうとすると、この例外はスローされません。

サービス アプリは、Spring フレームワークと Jaxb2Marshaller を使用して応答 xml を作成します。

クラス ReadWriteTextFile はここから取得されます

ありがとう。

編集: DB にデータを保存し、同時に 404 応答ステータス コードを返します。

また、php を使用して curl を実行してみて、CURLINFO_HTTP_CODE200 であることが判明しました。

これをデバッグするにはどうすればよいですか?サービスとクライアントの両方がローカル サーバー上にあります。

解決済み: SO自体の回答 を参照した後、問題を解決できました。

非標準ポートの URL に接続すると、HttpURLConnection は常に 404 応答を返すようです。

これらの行を追加すると解決しました

con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");
4

8 に答える 8

136

Spring / JAXBの組み合わせについてはわかりませんが、平均的なREST Webサービスは、POST / PUTで応答本文を返さず、応答ステータスのみを返します。体の代わりにそれを決定したいです。

交換

InputStream response = con.getInputStream();

int status = con.getResponseCode();

以前にリンクされているように、使用可能なすべてのステータスコードとその意味は、HTTP仕様で使用できます。Webサービス自体にも、Webサービスでサポートされているすべてのステータスコードとその特別な意味(ある場合)の概要を示すドキュメントが付属している必要があります。

4nnステータスがまたはで始まる場合は、代わりに、エラーの詳細が含まれている可能性のある応答本文を読み取るため5nnに使用します。getErrorStream()

InputStream error = con.getErrorStream();
于 2011-03-21T14:54:06.533 に答える
54

FileNotFoundWeb サーバーが 404 を返したことを示すために使用される残念な例外です。

于 2011-03-21T14:47:01.460 に答える
32

将来この問題が発生する場合、その理由はステータス コードが 404 (または私の場合は 500) だったためです。InpuStreamステータス コードが 200 でない場合、この関数はエラーをスローするようです。

私の場合、私は自分のサーバーを制御しており、エラーが発生したことを示すために 500 ステータス コードを返していました。エラーの詳細を示す文字列メッセージを含む本文も送信しましたinputstreamが、本文が完全に読み取り可能であるにもかかわらず、エラーがスローされました。

サーバーを制御している場合、これは自分自身に 200 ステータス コードを送信し、文字列のエラー応答が何であれ処理することで処理できると思います。

于 2014-05-25T17:09:37.547 に答える
4

この場合の FileNotFound は、サーバーから 404 を受け取ったことを意味します。サーバーが「POST」要求を好まない可能性がありますか?

于 2011-03-21T14:45:15.260 に答える
-1

解決策: これを知りたい場合は、PC のIPのlocalhost
変更するだけです: Windows+r > cmd > ipconfig 例: http:// 192.168.0.107 /directory/service/program.php?action=sendSomething just replace 192.168 .0.107を独自の IP に使用します ( 127.0.0.1はlocalhostと同じなので試さないでください) 。


于 2016-08-13T19:29:31.440 に答える
-5

変更してください

con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection();

con = (HttpURLConnection) new URL("http://YOUR_IP:8080/myapp/service/generate").openConnection();
于 2016-01-29T09:32:48.173 に答える