HttpURLConnection から InputStream オブジェクトを取得中に FileNotFoundException が発生する 質問する

HttpURLConnection から InputStream オブジェクトを取得中に FileNotFoundException が発生する 質問する

HttpURLConnection (Java で cUrl を使用するため) を使用して URL に POST リクエストを送信しようとしています。リクエストの内容は 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_CODE結果は 200 でした。

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

解決済み:私は、答えSO 自体に。

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

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

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

ベストアンサー1

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

交換する

InputStream response = con.getInputStream();

による

int status = con.getResponseCode();

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

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

InputStream error = con.getErrorStream();

おすすめ記事