[java] HttpURLConnection에서 InputStream 개체를 가져 오는 동안 FileNotFoundException이 발생했습니다.

HttpURLConnection을 사용하여 URL에 게시 요청을 보내려고합니다 (Java에서 cUrl 사용). 요청의 내용은 xml이고 끝점에서 응용 프로그램은 xml을 처리하고 데이터베이스에 레코드를 저장 한 다음 xml 문자열 형식으로 응답을 다시 보냅니다. 앱은 apache-tomcat에서 로컬로 호스팅됩니다.

터미널에서이 코드를 실행하면 예상대로 행이 db에 추가됩니다. 그러나 연결에서 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 파일에 대한 연결을 직접 열려고하면이 예외가 발생하지 않습니다.

서비스 앱은 스프링 프레임 워크와 Jaxb2Marshaller를 사용하여 응답 xml을 생성합니다.

ReadWriteTextFile 클래스는 여기 에서 가져옵니다 .

감사.

편집 :
DB에 데이터를 저장하고 동시에 404 응답 상태 코드를 보냅니다.

나는 또한 PHP를 사용하여 컬을 시도하고 CURLINFO_HTTP_CODE200으로 판명 된 것을 인쇄했습니다 .

이것을 디버깅하는 방법에 대한 아이디어가 있습니까? 서비스와 클라이언트는 모두 로컬 서버에 있습니다.

해결 : SO 자체에
대한 답변 을 참조하여 문제를 해결할 수 있습니다.

표준 포트가 아닌 URL에 연결할 때 HttpURLConnection이 항상 404 응답을 반환하는 것 같습니다.

이 줄을 추가하면 해결되었습니다.

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



답변

Spring / JAXB 조합에 대해서는 모르지만 평균 REST 웹 서비스는 POST / PUT에서 응답 본문을 반환하지 않고 응답 상태 만 반환합니다 . 신체 대신 결정하고 싶습니다.

바꾸다

InputStream response = con.getInputStream();

으로

int status = con.getResponseCode();

사용 가능한 모든 상태 코드와 의미는 이전에 링크 된대로 HTTP 사양에서 사용할 수 있습니다. 웹 서비스 자체는 웹 서비스에서 지원하는 모든 상태 코드와 해당하는 경우 그 특별한 의미를 개괄하는 문서와 함께 제공되어야합니다.

상태가 4nn또는로 시작하는 경우 오류 세부 정보를 포함 할 수있는 응답 본문을 읽는 데 대신 5nn사용할 getErrorStream()수 있습니다.

InputStream error = con.getErrorStream();


답변

FileNotFound 웹 서버가 404를 반환했음을 나타내는 데 사용되는 불행한 예외입니다.


답변

앞으로이 문제가있는 사람에게는 상태 코드가 404 (또는 제 경우에는 500)이기 때문입니다. InpuStream상태 코드가 200이 아닌 경우 함수에서 오류가 발생하는 것으로 보입니다 .

제 경우에는 자체 서버를 제어하고 오류가 발생했음을 나타내는 500 상태 코드를 반환했습니다. 오류를 자세히 설명하는 문자열 메시지와 함께 본문을 보냈음에도 불구하고 inputstream본문이 완전히 읽을 수 있는지에 관계없이 오류가 발생했습니다.

서버를 제어하는 ​​경우 200 상태 코드를 보낸 다음 문자열 오류 응답을 처리하여 처리 할 수 ​​있다고 가정합니다.


답변

이 문제를 겪고있는 다른 사람에게는 SOAP 요청 헤더를 SOAP 서비스에 보내려고 할 때 똑같은 일이 발생했습니다. 문제는 코드의 잘못된 순서 였으므로 XML 본문을 보내기 전에 먼저 입력 스트림을 요청했습니다. 아래 코드에서 줄 InputStream in = conn.getInputStream();ByteArrayOutputStream out = new ByteArrayOutputStream();잘못된 순서입니다.

ByteArrayOutputStream out = new ByteArrayOutputStream();
// send SOAP request as part of HTTP body 
byte[] data = request.getHttpBody().getBytes("UTF-8");
conn.getOutputStream().write(data);

if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
  Log.d(TAG, "http response code is " + conn.getResponseCode());
  return null;
}

InputStream in = conn.getInputStream();

FileNotFound 이 경우는 HTTP 응답 코드 400을 인코딩하는 불행한 방법이었습니다.


답변

이 경우 FileNotFound는 서버에서 404를 받았음을 의미합니다. 서버가 “POST”요청을 좋아하지 않을 수 있습니까?


답변

해결책 :

이것을 알고 싶다면 PC 의 IP
대한 localhost
변경 하십시오 : Windows + r> cmd> ipconfig
예제 : http : // 192.168.0.107 /directory/service/program.php?action=sendSomething

just replace 192.168 자신의 IP에 대해 .0.107 ( localhost 와 동일하므로 127.0.0.1을 시도하지 마십시오 )




답변

바꿔주세요

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

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