简体   繁体   中英

Android - Send XML file to PHP API server using HttpURLConnection

So currently, I'm trying to import some data in the form of an XML file to a server. I have successfully logged in and am doing everything through the API of the server. The website/server responds in XML, not sure if that is relevant.

When I use the import data action of the API, the request method is actually a GET and not a POST and the response content-type is text/xml. I want to strictly stick to using HttpURLConnection and I understand that sending this XML file will require some multipart content-type thing but I'm not really sure how to proceed from here. I've looked at these two examples but it does not work for my application (at least not directly). In addition, I don't really understand where they got some of the request headers from.

Send.txt file, document file to the server in android

http://alt236.blogspot.ca/2012/03/java-multipart-upload-code-android.html

A message from one of the developers have said "To upload the data use the action=importData&gwID=nnnn and with the usual Multipart content encoding and place the files in the request body as usual."

How would I send my XML file to my server through its API?

This is how you do it:

    public void postToUrl(String payload, String address, String subAddress) throws Exception
    {
      try
      {
        URL url = new URL(address);
        URLConnection uc = url.openConnection();
        HttpURLConnection conn = (HttpURLConnection) uc;
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-type", "text/xml");        
        PrintWriter pw = new PrintWriter(conn.getOutputStream());
        pw.write(payload);
        pw.close();
        BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
        bis.close();

      }
      catch (Exception e)
      {
        e.printStackTrace();
      }
    }

This is my implementation of a Multipart form data upload using HttpURLConnection.

public class WebConnector {
String boundary = "-------------" + System.currentTimeMillis();
private static final String LINE_FEED = "\r\n";
private static final String TWO_HYPHENS = "--";


private StringBuilder url;
private String protocol;
private HashMap<String, String> params;
private JSONObject postData;
private List<String> fileList;
private int count = 0;
private DataOutputStream dos;

public WebConnector(StringBuilder url, String protocol,
                    HashMap<String, String> params, JSONObject postData) {
    super();
    this.url = url;
    this.protocol = protocol;
    this.params = params;
    this.postData = postData;
    createServiceUrl();
}

public WebConnector(StringBuilder url, String protocol,
                    HashMap<String, String> params, JSONObject postData, List<String> fileList) {
    super();
    this.url = url;
    this.protocol = protocol;
    this.params = params;
    this.postData = postData;
    this.fileList = fileList;
    createServiceUrl();
}

public String connectToMULTIPART_POST_service(String postName) {


    System.out.println(">>>>>>>>>url : " + url);

    StringBuilder stringBuilder = new StringBuilder();

    String strResponse = "";
    InputStream inputStream = null;
    HttpURLConnection urlConnection = null;

    try {
        urlConnection = (HttpURLConnection) new URL(url.toString()).openConnection();
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestProperty("Connection", "close");
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 ( compatible ) ");
        urlConnection.setRequestProperty("Authorization", "Bearer " + Config.getConfigInstance().getAccessToken());
        urlConnection.setRequestProperty("Content-type", "multipart/form-data; boundary=" + boundary);

        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);
        urlConnection.setChunkedStreamingMode(1024);
        urlConnection.setRequestMethod("POST");
        dos = new DataOutputStream(urlConnection.getOutputStream());

        Iterator<String> keys = postData.keys();
        while (keys.hasNext()) {
            try {
                String id = String.valueOf(keys.next());
                addFormField(id, "" + postData.get(id));
                System.out.println(id + " : " + postData.get(id));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        try {
            dos.writeBytes(LINE_FEED);
            dos.flush();
            dos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (fileList != null && fileList.size() > 0 && !fileList.isEmpty()) {
            for (int i = 0; i < fileList.size(); i++) {

                File file = new File(fileList.get(i));
                if (file != null) ;
                addFilePart("photos[" + i + "][image]", file);
            }
        }
        // forming th java.net.URL object

        build();
        urlConnection.connect();
        int statusCode = 0;
        try {
            urlConnection.connect();
            statusCode = urlConnection.getResponseCode();
        } catch (EOFException e1) {
            if (count < 5) {
                urlConnection.disconnect();
                count++;
                String temp = connectToMULTIPART_POST_service(postName);
                if (temp != null && !temp.equals("")) {
                    return temp;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 200 represents HTTP OK
        if (statusCode == HttpURLConnection.HTTP_OK) {
            inputStream = new BufferedInputStream(urlConnection.getInputStream());
            strResponse = readStream(inputStream);
        } else {
            System.out.println(urlConnection.getResponseMessage());
            inputStream = new BufferedInputStream(urlConnection.getInputStream());
            strResponse = readStream(inputStream);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (null != inputStream)
                inputStream.close();
        } catch (IOException e) {
        }
    }
    return strResponse;
}

public void addFormField(String fieldName, String value) {
    try {
        dos.writeBytes(TWO_HYPHENS + boundary + LINE_FEED);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"" + LINE_FEED + LINE_FEED/*+ value + LINE_FEED*/);
        /*dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + LINE_FEED);*/
        dos.writeBytes(value + LINE_FEED);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public void addFilePart(String fieldName, File uploadFile) {
    try {
        dos.writeBytes(TWO_HYPHENS + boundary + LINE_FEED);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\";filename=\"" + uploadFile.getName() + "\"" + LINE_FEED);
        dos.writeBytes(LINE_FEED);

        FileInputStream fStream = new FileInputStream(uploadFile);
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];
        int length = -1;

        while ((length = fStream.read(buffer)) != -1) {
            dos.write(buffer, 0, length);
        }
        dos.writeBytes(LINE_FEED);
        dos.writeBytes(TWO_HYPHENS + boundary + TWO_HYPHENS + LINE_FEED);
    /* close streams */
        fStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void addHeaderField(String name, String value) {
    try {
        dos.writeBytes(name + ": " + value + LINE_FEED);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public void build() {
    try {
        dos.writeBytes(LINE_FEED);
        dos.flush();
        dos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static String readStream(InputStream in) {
    StringBuilder sb = new StringBuilder();
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String nextLine = "";
        while ((nextLine = reader.readLine()) != null) {
            sb.append(nextLine);
        }
    /* Close Stream */
        if (null != in) {
            in.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return sb.toString();
}

private void createServiceUrl() {
    if (null == params) {
        return;
    }
    final Iterator<Map.Entry<String, String>> it = params.entrySet().iterator();
    boolean isParam = false;
    while (it.hasNext()) {
        final Map.Entry<String, String> mapEnt = (Map.Entry<String, String>) it.next();
        url.append(mapEnt.getKey());
        url.append("=");
        try {
            url.append(URLEncoder.encode(mapEnt.getValue(), "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        url.append(WSConstants.AMPERSAND);
        isParam = true;
    }
    if (isParam) {
        url.deleteCharAt(url.length() - 1);
    }
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM