HttpURLConnection POST, conn.getOutputStream() throwing Exception

45,680

Solution 1

The URL simply cannot be reached. Either the URL is wrong, or the DNS server couldn't resolve the hostname. Try a simple connect with a well-known URL to exclude one and other, e.g.

InputStream response = new URL("http://stackoverflow.com").openStream();
// Consume response.

Update as per the comments, you're required to use a proxy server for HTTP connections. You need to configure that in the Java side as well. Add the following lines before any attempt to connect to an URL.

System.setProperty("http.proxyHost", "proxy.example.com");
System.setProperty("http.proxyPort", "8080");

It suffices to do this only once during runtime.

See also:

Solution 2

Without establishing the connection (which in this case requires 1 more step to be performed ie connect), transfer is not possible. connect() should be called after the connection is configured (ie after being done with the set***() on the connection).

What is missing is:

conn.connect();
Share:
45,680
AdrianS
Author by

AdrianS

Updated on September 28, 2020

Comments

  • AdrianS
    AdrianS over 3 years

    I want to make a POST by using HttpURLConnection. I am trying this in 2 ways, but I always get an excetion when doing: conn.getOutputStream();

    The exception I get in both cases is:

    java.net.SocketException: Operation timed out: connect:could be due to invalid address

    function1:

    public void makePost(String title, String comment, File file) {
        try {
            URL servlet = new URL("http://" + "www.server.com/daten/web/test/testupload.nsf/upload?CreateDocument");            
            HttpURLConnection conn=(HttpURLConnection)servlet.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            String boundary = "---------------------------7d226f700d0";
            conn.setRequestProperty("Content-type","multipart/form-data; boundary=" + boundary);
            //conn.setRequestProperty("Referer", "http://127.0.0.1/index.jsp");
            conn.setRequestProperty("Cache-Control", "no-cache");
    
            OutputStream os = conn.getOutputStream(); //exception throws here!
            DataOutputStream out = new DataOutputStream(os);
            out.writeBytes("--" + boundary + "\r\n");
            writeParam(INPUT_TITLE, title, out, boundary);
            writeParam(INPUT_COMMENT, comment, out, boundary);
            writeFile(INPUT_FILE, file.getName(), out, boundary);
            out.flush();
            out.close();
    
            InputStream stream = conn.getInputStream();
            BufferedInputStream in = new BufferedInputStream(stream);
            int i = 0;            
            while ((i = in.read()) != -1) {
                System.out.write(i);            
            }            
            in.close();
        } catch (Exception e) {  
            e.printStackTrace();
        }
    }
    

    or function 2:

    public void makePost2(String title, String comment, File file) {
    
        File binaryFile = file;
        String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
    
        URLConnection connection = null;
        try {
            connection = new URL("http://" + "www.server.com/daten/web/test/testupload.nsf/upload?CreateDocument").openConnection();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        PrintWriter writer = null;
        try {
            OutputStream output = connection.getOutputStream(); //exception throws here
            writer = new PrintWriter(new OutputStreamWriter(output, CHARSET), true); // true = autoFlush, important!
    
            // Send normal param.
            writer.println("--" + boundary);
            writer.println("Content-Disposition: form-data; name=\""+ INPUT_TITLE +"\"");
            writer.println("Content-Type: text/plain; charset=" + CHARSET);
            writer.println();
            writer.println(title);
    
    //        Send binary file.
            writer.println("--" + boundary);
            writer.println("Content-Disposition: form-data; name=\""+ INPUT_FILE +"\"; filename=\"" + binaryFile.getName() + "\"");
            writer.println("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName()));
            writer.println("Content-Transfer-Encoding: binary");
            writer.println();
            InputStream input = null;
            try {
                input = new FileInputStream(binaryFile);
                byte[] buffer = new byte[1024];
                for (int length = 0; (length = input.read(buffer)) > 0;) {
                    output.write(buffer, 0, length);
                }
                output.flush(); // Important! Output cannot be closed. Close of writer will close output as well.
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
            }
            writer.println(); // Important! Indicates end of binary boundary.
    
            // End of multipart/form-data.
            writer.println("--" + boundary + "--");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (writer != null) writer.close();
        }
    
    
    }
    
  • Christian Kuetbach
    Christian Kuetbach over 13 years
    java.net.SocketException: Operation timed out: connect:could be due to invalid address tells everything.
  • AdrianS
    AdrianS over 13 years
    I have a FORM in a html file that makes a POST to the same exact URL and it works. What gives?
  • BalusC
    BalusC over 13 years
    You mean, in a normal webbrowser? If so, does it use a HTTP proxy server? If so, you should configure that in Java side as well.
  • AdrianS
    AdrianS over 13 years
    Yes! That must be it! Trying now
  • BalusC
    BalusC over 13 years
    OK, I updated the answer to add more detail about how to achieve this in Java end.