Perbedaan GET dan POST Pada HTTP

Saturday, April 12th, 2008

Dalam membuat aplikasi web, tentunya kita sudah sering menggunakan metode GET dan POST dalam pengiriman data ke web server. Secara gamblang kita bisa menyebutkan perbedaan GET dan POST dari metode pengiriman data yang mereka gunakan. Yang mana dengan GET kita cukup mengirimkan data dengan menambahkannya di URI. Berikut contoh pengiriman data dengan metode GET

http://google.com?q=dolly+aswin+harahap

Dari contoh URI diatas, bisa diartikan bahwa kita mengakses web server google.com dan mengirimkan data melalui variabel q untuk di proses di web server google. Sedangkan untuk metode POST data tidak bisa dikirimkan melalui URI, kita harus mendefenisikan form dengan menggunakan method POST terlebih dahulu. Walaupun kita juga bisa mendefenisikan form dengan metode GET juga. Untuk itu disini saya mencoba menjelaskan perbedaan diantara keduanya lebih detail (maaf kalau ternyata kurang detail juga).

Metode GET Menurut RFC 2616
Dengan menggunakan metode GET, HTTP Client bisa mengambil informasi dari server dengan mengirimkan data melalui URI walaupun bisa juga dengan form yang menggunakan metode GET yang mana ujung - ujungnya duit data tersebut tetap dikirimkan juga melalui URI.

Hasil dari permintaan dengan metode GET dapat bersifat cacheable. Dan metode GET juga memiliki kondisional If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, ataupun If-Range yang ditujukan untuk menentukan apakah hasil dari permintaan HTTP Client akan diberikan server atau tidak. Ini bertujuan untuk mengurangi trafik antara HTTP Client dan Server yang mana jika hasil permintaan hasil permintaan tersebut sudah pernah ada di HTTP Client (sudah pernah diminta sebelumnya) maka HTTP Server tidak lagi memberikan permintaan tersebut.

Metode POST Menurut RFC 2616
Metode POST digunakan untuk mengirimkan data dari HTTP Client untuk diproses di HTTP Server, kemudian HTTP server memberikan hasil dari proses tersebut ke HTTP Client. Data yang dikirimkan dengan metode POST disertakan pada baris permintaan (body of request) bukan pada URI. Dan hasil dari permintaan dengan metode POST ini tidak bersifat cacheable.

Contoh Komunikasi HTTP Client dan HTTP Server Dengan Metode GET
Berikut contoh komunikasi antara HTTP Client dan HTTP Server dengan metode GET

GET /info.php?serv=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

HTTP Client meminta HTTP Server milik localhost untuk memberikan hasil dari info.php dengan mengirimkan data serv yang bernilai 1 ke HTTP Client. Setelah mendapat permintaan tersebut HTTP Server menjawab seperti ini:

HTTP/1.x 200 OK
Date: Fri, 11 Apr 2008 21:28:40
GMTServer: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch1 mod_ruby/1.2.6 Ruby/1.8.5(2006-08-25) mod_perl/2.0.2 Perl/v5.8.8
X-Powered-By: PHP/5.2.0-8+etch1
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

Contoh Komunikasi HTTP Client dan HTTP Server Dengan Metode POST
Berikut contoh komunikasi antara HTTP Client dan HTTP Server dengan metode POST.

POST /submit.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070310 Iceweasel/2.0.0.3 (Debian-2.0.0.3-1)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/submit.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
         user=dolly&password=dollykeren

HTTP Client meminta HTTP Server milik localhost untuk memberikan hasil dari submit.php dengan mengirimkan data user dan password untuk diproses di server kemudian. Setelah mendapat permintaan tersebut HTTP Server menjawab seperti ini:

HTTP/1.x 200 OK
Date: Sat, 12 Apr 2008 00:03:00
GMTServer: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch1 mod_ruby/1.2.6 Ruby/1.8.5(2006-08-25) mod_perl/2.0.2 Perl/v5.8.8
X-Powered-By: PHP/5.2.0-8+etch1
Content-Length: 1234
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Dari jawaban HTTP Server diatas bisa diartikan bahwa permintaan dari HTTP Client dikabulkan (HTTP/1.1 200 OK). Kemudian HTTP Server memberikan permintaan HTTP Client tadi dan beberapa informasi seperti Date, Server dan selebihnya bisa lihat sendiri diatas.

Sebenarnya beginilah cara web browser (HTTP Client) berkomunikasi dengan web server (HTTP Server) dan ini disembunyikan dari anda. Lho koq bisa ketahuan juga? Caranya gampang, dan anda tidak perlu menjadi blogger hacker untuk mengetahuinya. Untuk web browser mozilla firefox tambahkan saja extension Live HTTP Header, untuk browser yang lain saya kurang tahu. Dan cara yang lebih geek lagi, gunakan telnet :p

Penggunaan Metode GET dan POST Dalam AJAX
Dalam AJAX penggunaan metode GET dan POST sebenarnya juga berbeda[3]. Untuk metode GET kita bisa langsung meminta ke HTTP Server dan mengirimkan data melalui URI. Berikut contoh penggunaan metode POST dalam AJAX:

var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
http.open("POST", url, true);
 
//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
 
http.onreadystatechange = function() {
        //Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
                alert(http.responseText);
        }
}
http.send(params);

Sebenarnya beginilah cara penggunaan POST dan GET di dalam AJAX. Dan pada pustaka jQuery penggunaannya sudah lebih gampang tidak seperti ini lagi, sehingga antara metode POST dan GET kelihatannya sama.

Referensi:
[1] http://en.wikipedia.org/wiki/HTTP
[2] http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
[3] www.openjs.com.articles.ajax_xmlhttp_using_post.php

Serialisasi Variabel di PHP

Monday, March 10th, 2008

Serialisasi (serialization) adalah suatu teknik di dalam bahasa pemrograman yang digunakan untuk merepresentasikan suatu data/variabel ke dalam string. Ini ditujukan agar data tersebut dapat disimpan di suatu file atau dikirimkan melewati koneksi jaringan ke komputer lain.

Pada bahasa pemrograman python untuk melakukan serialisasi terhadap suatu objek bisa menggunakan modul pickle ataupun shelve. Dan pada bahasa pemrograman PHP bisa menggunakan fungsi serialize(), dan untuk mengembalikan hasil serialisasi tersebut ke bentuk semula (deserialisasi) menggunakan fungsi unserialize().

Di PHP, hanya variabel dengan tipe data resource yang tidak bisa diserialisasikan. Pada umumnya variable dengan tipe data resource ini merujuk ke suatu objek di luar PHP seperti membuka file ataupun koneksi ke database. Berikut contoh serialisasi untuk variabel dengan tipe data array.

<?php
$var = array('satu' => 1, 'dua' => 2);
echo serialize($var), PHP_EOL;
?>

Jika dieksekusi maka kode program diatas akan memberikan keluaran berupa string

a:2:{s:4:”satu”;i:1;s:3:”dua”;i:2;}

Untuk mengembalikan bentuk string tersebut menjadi array kembali, maka string tersebut harus di deserialisasi.

<?php
$var = unserialize('a:2:{s:4:"satu";i:1;s:3:"dua";i:2;}');
print_r($var);
?>

Jika dieksekusi maka kode program diatas mengembalikan string hasil serialisasi menjadi variable bertipe array kembali.

Array
(
[satu] => 1
[dua] => 2
)

Untuk serialisasi variabel bertipe object, maka class dari object tersebut harus diikut sertakan ke dalam kode program. Jika tidak maka hasil deserialisasi tidak akan mengenali class dari object tersebut dan menganggapnya sebagai __PHP_Incomplete_Class. Untuk lebih jelasnya bisa melihat contoh dibawah ini:

File halo.php

<?php
 
class Halo
{
	var $halo;
	var $dunia;
 
	function __construct()
	{
		$this->setHalo();		
		$this->setDunia();		
	}
 
	function halodunia()
	{
		echo $this->halo, ' ', $this->dunia, PHP_EOL;
	}
 
	function setHalo()
	{
		$this->halo = 'halo';
	}
	
	function setDunia()
	{
		$this->dunia = 'dunia';
	}
 
}
?>

File serialize-object.php

<?php
include 'halo.php';
 
$class = new Halo();
$serialize = serialize($class);
 
if ($fp = fopen('object.txt', 'w+')) {
	fwrite($fp, $serialize);
	fclose($fp);
}
?>

File unserialize-object.php

<?php
include 'halo.php';
 
if ($fp = fopen('object.txt', 'r')) {
	$serialize = fread($fp, 4096);
	fclose($fp);
 
	$class = unserialize($serialize);
	$class->halodunia();
}
?>

Penjelasan Kode Program
Pada file serialize-object.php kode program membuat instan dari class Halo dan menyimpannya kedalam object. Kemudian object tersebut diserialisasi, dan hasil dari serialisasi tersebut disimpan kedalam file object.txt. Agar object tersebut bisa digunakan kembali di file lain, maka pada file unserialize-object.php kode program mengambil hasil serialisasi tersebut dan menjadikannya object kembali. Setelah menjadi object, maka kita bisa mengakses method halodunia();

Dengan melihat contoh kode program diatas maka akan lebih mudah untuk mengerti bagaimana sebenarnya penggunaan serialisasi. Contoh lain dari penggunaan serialisasi di PHP adalah pada penanganan session. Variabel yang didaftarkan di session akan diserialisasi, dan hasil dari serialisasi tersebut kemudian disimpan di dalam file di server.

Referensi :
- http://en.wikipedia.org/wiki/Serialization
- http://id2.php.net/serialize
- http://id2.php.net/unserialize
- http://id2.php.net/manual/en/ref.session.html
- David Sklar, Adam Trachtenberg “PHP Cookbook, 2nd Edition”, Agustus 2006
- Elliot White III, Jonathan Eisenhamer “PHP 5 in Practice”, July 11, 2006

Apa Sih Framework Itu?

Wednesday, December 19th, 2007

Berawal dari postingan saya sebelumnya, ada yang menanyakan tentang apa sih framework itu sebenarnya? Waktu itu saya coba menjelaskan framework secara singkat, dan itu belum bisa membuatnya mengerti. Baiklah, disini akan saya bahas lebih lanjut tentang pengertian framework ini.

Menurut kamus Inggris - Indonesia yang disusun oleh John M. Echols dan Hassan Sadily framework memiliki arti kerangka. Tetapi saya lebih suka mengartikan framework ini menjadi kerangka kerja. Kenapa disebut kerangka kerja? Karena pekerjaan yang akan dilakukan harus mengikuti dan tidak lari dari kerangka tersebut. Seperti tukang jahit yang menggunting kain untuk pakaian berdasarkan pola(framework) yang ada. Maklum ibu saya adalah tukang jahit, maka itu saya tahu akan hal ini.

Kembali ke dunia IT khususnya pemrograman, framework terdiri dari modul - modul yang mempunyai tugasnya masing - masing (menangani database, XmlRPC, email, dll) dan memiliki aturan pakai (aturan penulisan kode program, struktur direktori/file, dan penggunaan modul). Memang menjadi lebih rumit dan lebih lambat, bagi anda yang biasanya menulis kode program tanpa menggunakan framework. Tapi percayalah, jika sudah terbiasa menggunakan framework maka anda akan merasakan manfaatnya yang begitu luar biasa yaitu waktu pengerjaan dan kode yang lebih sedikit dan juga file - file anda lebih terstruktur.

Kita asumsikan anda disuruh untuk membuat program yang membaca RSS dan kemudian menampilkannya. Dengan menggunakan framework, kita hanya tinggal panggil modul yang menangani RSS, buat object, panggil methodnya, kemudian tampilkan. Simpel kan? Hanya beberapa baris kode saja. Hal ini akan sangat jauh berbeda jika anda mengerjakannya tanpa framework.

Contoh diatas adalah contoh membuat aplikasi yang sederhana. Seperti kata Julius Sirait “Tapi kalau udah 20 tabel dan dengan business logic yang memusingkan, tetap aja bikin sakit kepala”.

Framework bukanlah kantong ajaib Doraemon yang akan memberikan apa yang anda minta. Framework hanya merupakan alat bantu. Jika anda disuruh merancang sitem yang besar, gunakanlah logika anda untuk merancangnya dan framework sebagai alat bantu untuk mengimplementasikan rancangan anda tersebut.

Saat ini tersedia banyak framework yang dapat anda pilih dan gunakan untuk membantu pekerjaan anda. Ada .NET (untuk membuat aplikasi yang jalan di Sistem Operasi Windows), Ruby On Rails (untuk membuat aplikasi web dengan bahasa Ruby), Django (untuk membuat aplikasi Web dengan bahasa Python) dan banyak lagi. Jadi intinya, framework ini dibuat untuk membantu pemrogram agar tidak memulai dari 0 (nol) lagi setiap projectnya. Mudah - mudahan penjelasan dan contoh diatas bisa membuat anda lebih mengerti.