Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to setEntity on a HttpURLConnection

Tags:

java

In my project I must strictly use HttpURLConnection class

I have this following code which I got from the internet

MultipartEntity multiPart = new MultiPartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null Chartset.forName("UTF-8");
File f = new File("/home/abhishek/foo.docx");
FileBody fb = new FileBody(f);
multiPart.addPart("file", fb);
HttpPost post = new HttpPost();
post.setHeader("ENCTYPE", "multipart/form-data");
post.setEntity(multiPart);

Problem is that I cannot use HttpPost ... In my project only HttpURLConnection class works!

So I need to translate the code above into HttpURLConnection.

I cannot find anything similar to setEntity on the HttpUrlConnection.

Edit::

Based on the suggestions below. I have this code

public class RESTFileUpload {
      public static void main(String[] args) throws Exception {
            Authenticator.setDefault(new Authenticator() { 
                @Override
                public PasswordAuthentication getPasswordAuthentication() {
                 return new PasswordAuthentication("domain\\user", "Password".toCharArray());
                }
            });

            String filePath = "/home/abhishek/Documents/HelloWorld.docx";
            String fileName = "HelloWorld.docx";
            String fileNameShort = "HelloWorld";

            String urlStr = "https://sp.company.com/sites/abhi_test/_vti_bin/listdata.svc/SharedDocuments/RootFolder/Files/add(url=@TargetFileName,overwrite='true')&@TargetFileName=" + fileName;
            String crlf = "\r\n";
            String twoHypens = "--";
            String boundary = "*****";
            URL url = new URL(urlStr);          
            HttpURLConnection con = (HttpURLConnection) url.openConnection();           
            con.setDoOutput(true);
            con.setDoInput(true);     
            con.setUseCaches(false);
            con.setRequestMethod("POST");
            con.setRequestProperty("Connection", "Keep-Alive");
            con.setRequestProperty("Cache-Control", "no-cache");
            con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            DataOutputStream request = new DataOutputStream(con.getOutputStream());
            request.writeBytes(twoHypens + boundary + crlf);
            request.writeBytes("Content-Disposition: form-data;name=\"" + fileNameShort + "\";fileName=\"" + fileName + "\"" + crlf);
            request.writeBytes(crlf);
            request.write(convertToByteArray(filePath));
            request.writeBytes(crlf);
            request.writeBytes(twoHypens + boundary + twoHypens + crlf);
            request.flush();
            request.close();

            InputStream responseStream = new BufferedInputStream(con.getInputStream());
            BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
            String line = "";
            StringBuilder strBuilder = new StringBuilder();
            while((line = responseStreamReader.readLine()) != null) {
                strBuilder.append(line).append("\n");
            }
            responseStreamReader.close();
            String response = strBuilder.toString();
            responseStream.close();
            con.disconnect();
            System.out.println(response);
      }   

      private static byte[] convertToByteArray(String filePath) {
          File f = new File(filePath);
          byte[] retVal = new byte[(int)f.length()];
          try {
              FileInputStream fis = new FileInputStream(f);
              fis.read(retVal);
          }
          catch (FileNotFoundException ex) {
              ex.printStackTrace();
          }
          catch(IOException ex2) {
              ex2.printStackTrace();
          }
          return retVal;
      }
}

But I get the error

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 400 for URL: https://sp.web.gs.com/sites/abhi_test/_vti_bin/listdata.svc/SharedDocuments/
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at RESTFileUpload.main(RESTFileUpload.java:62)
like image 812
Knows Not Much Avatar asked Apr 01 '14 00:04

Knows Not Much


1 Answers

HttpURLConnection has .getInputStream() and .getOutputStream() methods. If you wish to send body content with an Http request, you call .setDoOutput(true) on your HttpURLConnection object, call .getOutputStream() to get an Output stream and then write the content of your entity to the output stream (either as raw bytes, or using a Writer implementation of some sort), closing it when you are finished writing.

For more details, see the API docs for HttpURLConnection here.

like image 167
djmorton Avatar answered Sep 27 '22 19:09

djmorton