Estou tentando enviar uma solicitação de postagem para um url usando HttpURLConnection (para usar cUrl em java). O conteúdo da solicitação é xml e, no ponto final, o aplicativo processa o xml e armazena um registro no banco de dados e, em seguida, envia de volta uma resposta na forma de string xml. O aplicativo está hospedado no apache-tomcat localmente.
Quando executo este código no terminal, uma linha é adicionada ao banco de dados conforme o esperado. Mas uma exceção é lançada da seguinte maneira ao obter o InputStream da conexão
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)
Aqui está o código
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();
}
}
}
É confuso porque a exceção é rastreada até a linha InputStream response = con.getInputStream();
e não parece haver nenhum arquivo envolvido para uma FileNotFoundException.
Quando tento abrir uma conexão com um arquivo xml diretamente, ele não lança essa exceção.
O aplicativo de serviço usa o framework spring e Jaxb2Marshaller para criar o xml de resposta.
A classe ReadWriteTextFile é tirada daqui
Obrigado.
Edit: Bem, ele salva os dados no banco de dados e envia de volta um código de status de resposta 404 ao mesmo tempo.
Eu também tentei fazer um curl usando php e imprimir o CURLINFO_HTTP_CODE
que acabou sendo 200.
Alguma ideia de como faço para depurar isso? O serviço e o cliente estão no servidor local.
Resolvido: eu poderia resolver o problema após consultar uma resposta no próprio SO.
Parece que HttpURLConnection sempre retorna a resposta 404 ao se conectar a um url com uma porta não padrão.
Adicionar essas linhas resolveu
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");