I’m starting to dive deep into Android world. The first step is usually the hardest. I’m starting to grasp how the Android environment operates. The best way for me to learn is by reading, and actually doing it. So, I started to build a room reservation app using an web service API built by my co-worker. Calling this API requires HTTP POST call from Android. This is where it gets interesting. I tried scouring the web for hours, and all the example I found did not work! I finally looked into android documentation, which is really where I should started first. It seems so simple. I could do it in 10 seconds in c#. However during my trial, all the post parameters are not recognized by the API, which is written using PHP. I’ll describe some of the mistake I made.

//import these on your header

import java.io.IOException;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

//do this wherever you are wanting to POST
URL url;
HttpURLConnection conn;

try{
//if you are using https, make sure to import java.net.HttpsURLConnection
url=new URL(“http://somesite/somefile.php”);

//you need to encode ONLY the values of the parameters
String param=”param1=” + URLEncoder.encode(“value1″,”UTF-8″)+
“&param2=”+URLEncoder.encode(“value2″,”UTF-8″)+
“&param3=”+URLEncoder.encode(“value3″,”UTF-8″);

conn=(HttpURLConnection)url.openConnection();
//set the output to true, indicating you are outputting(uploading) POST data
conn.setDoOutput(true);
//once you set the output to true, you don’t really need to set the request method to post, but I’m doing it anyway
conn.setRequestMethod(“POST”);

//Android documentation suggested that you set the length of the data you are sending to the server, BUT
// do NOT specify this length in the header by using conn.setRequestProperty(“Content-Length”, length);
//use this instead.
conn.setFixedLengthStreamingMode(param.getBytes().length);
conn.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded”);
//send the POST out
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(param);
out.close();

//build the string to store the response text from the server
String response= “”;

//start listening to the stream
Scanner inStream = new Scanner(conn.getInputStream());

//process the stream and store it in StringBuilder
while(inStream.hasNextLine())
response+=(inStream.nextLine());

}
//catch some error
catch(MalformedURLException ex){
Toast.makeText(MyActivity.this, ex.toString(), 1 ).show();
}
// and some more
catch(IOException ex){

Toast.makeText(MyActivity.this, ex.toString(), 1 ).show();
}

That’s it. Whatever output you receive from the URL you are calling would be stored in response string.