14 December 2008

Membuat Http Post Client dengan Java

Apa sih yang terlintas di benak kita ketika kita membaca judul di atas?. Dalam teknologi internet kita sering kali menemukan interaksi yang terjadi antara user dengan sebuah website. Salah satu interaksi tsb misalnya adalah user diminta memasukkan suatu data dalam sebuah website untuk kepentingan website tsb. Ketika interaksi tersebut terjadi, kita bisa memahami bahwa dalam aplikasi web tersebut sebenarnya ada proses dimana ada data yang di masukkan ke server.

Ketika user memasukkan suatu data, terjadi sebuah proses posting ke dalam server. Dalam web programming kita mengenal dua metode untuk proses posting, metode tsb adalah metode post dan metode get. Metode get adalah suatu mekanisme posting data yang dalam prosesnya parameter-parameter yang diposting terlihat dalam address bar browser, sementara metode post adalah suatu mekanisme posting data yang paramater-parameter yang di posting tidak terlihat dalam address bar browser.

Dalam kesempatan kali ini kita akan mencoba membuat sebuah aplikasi java konsol, dimana aplikasi tsb mempunyai kemampuan untuk melakukan posting ke sebuah URL dengan metode HTTP POST. untuk percobaan kita kali ini, kita akan membutuhkan elemen server. Dimana Elemen server ini berguna untuk menangkap posting yang kita lakukan dengan menggunakan aplikasi java konsol kita. Kita akan membuat elemen servernya dengan menggunakan script PHP saja biar lebih simple dan mudah. Ok perhatikan script php dibawah ini, script ini kita buat untuk menangkap posting data yang dilemparkan.


 <?php
//define all param
$name = $_POST["name"];
$phone = $_POST["phone"];
$email = $_POST["email"];
$address = $_POST["address"];

//print our all posted param
echo "Name : ".$name."<br>";
echo "Phone : ".$phone."<br>";
echo "Email : ".$email."<br>";
echo "Address : ".$address."<br>";


//other method to go to next process goes here...!!!

?>

Sederhana saja script php di atas, pertama deklarasikan semua paramater yang dilempar ke script tersebut, kemudian print out semua paramater yang telah dilempar. Jika anda menginginkan proses lebih lanjut misalnya proses simpan ke database, silahkan saja buat proses selanjutnya seperti yang anda inginkan, yang penting lima baris definisi variabel yang menangkap posting ke file ini tetap ada. Dalam script php itu kita lihat, kita sengaja memakai $_POST untuk menangkap paramater yang dilempar karena aplikasi kita nanti akan menggunakan metode HTTP POST, jika aplikasi kita menggunakan metode http get, maka tidak seperti diatas deklarasi variabel yang menangkap parameter-parameter posting.

Script php ini kita beri nama test.php, kemudian kita buat sebuah folder dengan nama server_hit dalam folder htdocs instalasi apache, dan kita letakkan file test.php ini ke folder yang baru kita buat tadi. Langkah selanjutnya kita jalankan server apache kita dan kita tes url tersebut, dengan membuka sebuah browser dan mengetikkan http://localhost/server_hit/test.php pada address bar yang ada. Jika ada pada browser tsb terlihat seperti gambar dibawah ini, maka aplikasi server php kita telah siap:

Sekarang kita akan membuat sebuah aplikasi java konsol, dimana aplikasi ini akan menembak url tsb. Aplikasi java console kita kali ini akan melibatkan library dari koleksi apache.common.project yaitu library common-httpclient, silahkan download dahulu library tersebut disini. Library ini juga mempunyai dependency terhadap library lain yaitu library common-logging yang juga merupakan koleksi apache.common.project, silahkan download library common-logging tsb disini.

Jika semua library yang kita butuhkan telah tersedia, mari kita lakukan percobaan ini. Link ini adalah file source aplikasi kita yang sudah selesai. Kita akan membahas kode ini dengan seksama. Dalam source tsb kita memiliki tiga buah method yaitu:

  1. public static Hashtable defineParamToPost.

  2. public static sendUrlPost.

  3. public static void main.

Ketiga method dalam aplikasi kita ini adalah metode yang statik, dimana metode ketiga adalah metode utama dalam aplikasi kita, sedangkan metode yang lainya, dalam penggunaannya bisa kita panggil langsung dalam metode utama tanpa mendeklarasikan aplikasi kita sebagai sebuah objeck baru, karena kedua metode ini juga statik.

Sekarang kita lihat isi masing-masing metode tsb, perhatikan isi dari metode pertama seperti dibawah ini:

....
....
public static Hashtable defineParamToPost(String sParamName,
String sParamPhone,
String sParamEmail,
String sParamAddress) {
Hashtable hash = new Hashtable();
hash.put("name", sParamName);
hash.put("phone", sParamPhone);
hash.put("email", sParamEmail);
hash.put("address", sParamAddress);
return hash;

}

.....
.....

Metode ini mempunyai kembalian (return) berupa objeck Hashtable dan mempunyai 4 paramater yang bertipe String. Dalam metode ini semua paramater di mapping ke dalam sebuah Objeck Hashtable dan kemudian di kembalikan dalam bentuk objeck Hashtable.

Sekarang kita bahas metode ke dua, yaitu metode sendUrlPost. Mari perhatikan baris-baris awal pada metode ini seperti dibawah ini.


......
......
......
public static String sendUrlPost(String Url, Hashtable hash,
int connectionTimeout, int readTimeout) {

System.out.println("Url To Post: " + Url);
System.out.println("Timeout limit for Connection :" + connectionTimeout + " milisecond");
System.out.println("Timeout limit for Read Response :" + readTimeout + " milisecond ");
System.out.println("Params to be posted on Hashtable Object : " + hash);

String sResponse = "";

Enumeration paramList = hash.keys();
Vector requestParamKey = new Vector(1, 1);
Vector requestParamValue = new Vector(1, 1);

System.out.println("Converting Hashtable to Vector....");

while (paramList.hasMoreElements()) {
String name = (String) paramList.nextElement();
String value = (String) hash.get(name);
requestParamKey.addElement(name);
requestParamValue.addElement(value);
if (!paramList.hasMoreElements()) {
break;
}
}
System.out.println("Convert Hashtable to Vector done...");
......
......
......
}


Dalam baris-baris awal metode tsb, kita mencetak semua paramater yang di passing ke metode ini, kemudian setelah kita deklarasikan String sResponse, kita meng-inisialisasi beberapa objeck yaitu, objeck Enumeration, dan Objeck Vector. Kemudian proses selanjutnya kita melakukan looping untuk memapping isi dari Hashtable ke dalam masing-masing objeck Vector yang kita sudah inisialisasikan sebelumnya yaitu requestParamKey dan requestParamValue. Kemudian untuk proses selanjutnya silahkan kita lihat lagi beberapa baris selanjutnya dari metode ini.


public static String sendUrlPost(String Url, Hashtable hash,
int connectionTimeout, int readTimeout) {
......
......
......

//create new HttpClient Object
HttpClient client = new HttpClient();

//Set Timeout till connection established
client.setConnectionTimeout(connectionTimeout);

// Set Timeout waiting for data
client.setTimeout(readTimeout);

int responseCode = -1;

// Create a method instance.
PostMethod method = new PostMethod(Url);
method.setHttp11(false);

String req_name = null;
String req_value = null;
......
......
}


Dalam baris berikutnya seperti diatas kita bisa melihat, beberapa metode dari library common-httpclient mulai banyak di pakai disini. Step pertama kita bisa melihat ada pembuatan objeck HttpClient disana, kemudian objeck tersebut disetting beberapa property yaitu property Connection Time Out dan property Timeout dimana property Timeout adalah banyaknya waktu yang diperlukan untuk membaca hasil koneksi yang dilakukan.

Kemudian objeck baru yang juga dibuat diatas adalah objeck PostMethod, untuk objeck ini property yang di set hanya http11 saja yang di set menjadi false karena kita memang tidak memakai http11 ini. Kemudian ada deklarasi dua buah String disana yang langsung di beri nilai null sebagai inisialisasi awal variabel tsb. Mari perhatikan kode selanjutanya seperti dibawah ini:


public static String sendUrlPost(String Url, Hashtable hash,
int connectionTimeout, int readTimeout) {
......
......
......

try {
//iterate Vector contains http_post params
System.out.println("Iterating Vector to map to post params...");
for (int i = 0; i < requestParamKey.size(); i++) {
req_name = (String) requestParamKey.elementAt(i);
req_value = (String) requestParamValue.elementAt(i);
method.addParameter(req_name, req_value);
}

System.out.println("Iterating Vector Done...");

//execute Post Method
System.out.println("Executing Http Method...");
responseCode = client.executeMethod(method);
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception runex) {
runex.printStackTrace();
}

//printout Server Status
System.out.println("HttpResponseCode : " + responseCode);

......
......
}


Dalam baris-baris diatas bahwa eksekusi post di lakukan disini setelah kita meng-iterasi Objeck Vector dan kemudian menempatkan masing-masing element dan nilainya ke dalam paramater metode http post. Proses tersebut harus dilakukan didalam blok try-catch untuk mencegah hal-hal yang tidak diinginkan seperti URL yang salah (ditunjukkan dengan catch MalformedURLException), atau catch-catch yang lainnya. Ketika method di eksekusi, server yang menerima eksekusi tsb pasti memulangkan status http, status ini bisa kita tangkap dan kemudian memprint-outnya ke atas konsol.

Sekarang mari kita perhatikan baris-baris terkahir dari metode ini:


public static String sendUrlPost(String Url, Hashtable hash,
int connectionTimeout, int readTimeout) {
......
......
......

if (responseCode != 200) {
// Release the connection.
method.releaseConnection();
System.out.println("Invalid HttpResponse: " + responseCode);
return sResponse;
}

// Read the response body.
System.out.println("Reading the Response Body...!!!");
byte[] responseBody = method.getResponseBody();

if (responseBody != null) {
System.out.println("Converting Response Body from byte array to String...");
sResponse = new String(responseBody);
if (sResponse != null) {
sResponse = sResponse.trim();
}
}

// Release the connection.
System.out.println("Releasing Connection...");
method.releaseConnection();

return sResponse;
}


Dalam baris-baris terakhir metode ini, kita bisa melihat bahwa jika respon kode http yang dipulangkan oleh server bukanlah 200 maka itu berarti proses posting kita tidak akan berhasil. Karena dalam respon kode http, sukses koneksi ke sebuah url akan ditandai oleh status http yang keluar dari server tsb berupa status 200. Kemudian baris selanjutnya dalam metode tersebut adalah mencoba membaca response body yang di hasilkan oleh file server yang kita hit tadi. Response body adalah tampilan suatu halaman akibat dari request yang kita lakukan pada sebuah halaman web.

Pembacaan Response body pada metode ini adalah membaca byte-byte yang memang tampil dari halaman tsb, pada metode ini byte-byte tsb kita masukkan dalam variabel yang berupa byte array(array of byte). Kemudian proses selanjutnya adalah mengkonversi byte array tadi ke sebuah string yang nantinya akan menjadi nilai kembalian metode ini. Proses terakhir metode ini adalah memutuskan koneksi yang ada pada metode http post itu.

Demikianlah pembahasan inti kedua metode ini yang kita buat dalam aplikasi kita kali ini, sementara untuk metode utamanya, saya rasa kita bisa mengerti dengan mudah, sebab metode utama aplikasi kita ini hanya memanggil kedua metode yang tadi sudah kita bahas.

Jika kita telah selesai melakukan pembuatan aplikasi kita ini, sekarang kita coba mengetes aplikasi kita ini, dari sisi saya aplikasi ini dapat berjalan dengan sukses menembak url yang kita definisikan tadi berikut screenshot-nya ketika aplikasi ini saya jalankan menggunakan IntelliJidea pada komputer saya, bagaimana dengan anda?

Untuk selanjutnya, anda bisa pakai konsep aplikasi ini untuk keperluan-keperluan posting data yang memang secara otomatis dapat dilakukan tanpa ada campur tangan user didalamnya. Misal memposting data ke dalam suatu web yang datanya banyak dan diambil dari isi suatu tabel dalam database, jika data yang diposting banyak maka, jika kita lakukan secara manual tentunya kegiatan posting ini akan banyak menyita waktu bukan.

Semoga bermanfaat.

Menteng January 15th 2008


josescalia

2 comments:

x-ace said...

wah itu terbalik Jo -> "Metode post adalah suatu mekanisme posting data yang dalam prosesnya parameter-parameter yang diposting terlihat dalam address bar browser, sementara metode get adalah suatu mekanisme posting data yang paramater-parameter yang di posting tidak terlihat dalam address bar browser."

di benerin yeee

JoseScalia said...

[Quote]
wah itu terbalik Jo -> "Metode post adalah suatu mekanisme posting data yang dalam prosesnya parameter-parameter yang diposting terlihat dalam address bar browser, sementara metode get adalah suatu mekanisme posting data yang paramater-parameter yang di posting tidak terlihat dalam address bar browser."

di benerin yeee

[/Quote]

Thank you cuyyy...dah di koreksi..lupa kali gue...dah gue benerin juga tuh..Thnks anyway..

josescalia