HttpURLConnection POST, conn.getOutputStream() throwing Exception
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();
AdrianS
Updated on September 28, 2020Comments
-
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 over 13 years
java.net.SocketException: Operation timed out: connect:could be due to invalid address
tells everything. -
AdrianS over 13 yearsI have a FORM in a html file that makes a POST to the same exact URL and it works. What gives?
-
BalusC over 13 yearsYou 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 over 13 yearsYes! That must be it! Trying now
-
BalusC over 13 yearsOK, I updated the answer to add more detail about how to achieve this in Java end.