13

I have a string that is already in the proper URLEncoded Form format and would like to send it through a POST request on Android to a PHP server. I know the method for sending URL encoded forms on Android uses the UrlEncodedFormEntity and I know how to use it. The problem with that is that the data comes into the function already URL encoded and joined by ampersands, so using UrlEncodedFormEntity would involve a lot of extra work to turn it into a List of NameValuePairs and I'd rather not.

So, how do I make a proper POST request sending this string as the content body?

I have already tried using StringEntity, but the PHP server didn't get any of the data (empty $_POST object).

I am testing against http://test.lifewanted.com/echo.json.php which simply is

<?php echo json_encode( $_REQUEST );

Here is an example of the already-encoded data:

partnerUserID=email%40example.com&partnerUserSecret=mypassword&command=Authenticate

Oz.
  • 4,571
  • 2
  • 21
  • 29

1 Answers1

15

If you don't mind using an HttpURLConnection instead of the (recommended) HttpClient then you could do it this way:

public void performPost(String encodedData) {
    HttpURLConnection urlc = null;
    OutputStreamWriter out = null;
    DataOutputStream dataout = null;
    BufferedReader in = null;
    try {
        URL url = new URL(URL_LOGIN_SUBMIT);
        urlc = (HttpURLConnection) url.openConnection();
        urlc.setRequestMethod("POST");
        urlc.setDoOutput(true);
        urlc.setDoInput(true);
        urlc.setUseCaches(false);
        urlc.setAllowUserInteraction(false);
        urlc.setRequestProperty(HEADER_USER_AGENT, HEADER_USER_AGENT_VALUE);
        urlc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        dataout = new DataOutputStream(urlc.getOutputStream());
        // perform POST operation
        dataout.writeBytes(encodedData);
        int responseCode = urlc.getResponseCode();
        in = new BufferedReader(new InputStreamReader(urlc.getInputStream()),8096);
        String response;
        // write html to System.out for debug
        while ((response = in.readLine()) != null) {
            System.out.println(response);
        }
        in.close();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
dave.c
  • 10,862
  • 5
  • 36
  • 61
  • 5
    good answer. in Gingerbread and later, HttpURLConnection is the way to go. consider Apache HttpClient deprecated. – Elliott Hughes Mar 10 '11 at 19:27
  • 1
    I just realized I never accepted this as the answer. This worked for me great. Thanks! – Oz. Sep 28 '11 at 04:12
  • 2
    Two things: InputStreamReader, according to Android's docs (http://developer.android.com/reference/java/io/InputStreamReader.html) is already buffered so there's no need for BufferedReader. And, also according to Android's docs, at the end of its use, you should (or rather must) call disconnect() on HttpURLConnection to release resources. – Gonan Jan 15 '13 at 00:44