lifelong learner — urip iku urup, currently working on accenture.

Rest Webservices dengan code igniter menggunakan library rest-server bagian 3 – CRUD

4
Degananda.com -

sebelum mengikuti ulasan dibawah ini diharapkan mengikuti ulasan part 1 dan part 2 mengenai rest web service dengan rest-server.
hasil kode ulasan+database(sql) ini dapat diunduh di :
https://drive.google.com/open?id=0By5rvYirLfy3aUdpa2wzOFd0V0U

Web services yang akan dibuat adalah tentang data mengenai siswa. Sederhanannya web service ini dapat mengakomodasi CRUD(Create , read , update dan delete) terhadap entitas siswa.

Fungsi – fungsi yang akan dibuat adalah :

  • Menambahkan data siswa (POST)
  • Mengubah data siswa (PUT)
  • Menghapus data siswa (DELTE)
  • Menampilkan data siswa (Pagging/sistem halaman+search+filter) (GET)

ke empat fungsi tersebut hanya dapat diakses jika memiliki API-KEY sebagaimana telah didefinisikan pada part-2. Untuk memisah antara api yang membutuhkan key dan tidak, serta mendokumentasikan API dengan apidoc akan dibahas pada part-4 :). jadi jangan lupa untuk terus mengikuti perkembangan ulasan ini ya.

Here we go ~

Langkah 1 – membuat database

Tahapan awal yang harus dilakukan adalah membuat database(basis data) untuk menyimpan data siswa tersebut. RDBMS yang digunakan adalah Mysql dengan tools phpmyadmin.

screen-shot-2016-11-22-at-11-14-57-am

  • id_siswa bersifat auto increment dan dia adalah primary key yang mana menjadi pembeda antar row pada tabel.
  • nama_siswa(varchar dengan panjang 50) menyimpan data mengenai nama lengkap dari siswa tersebut
  • alamat_siswa(text) menyimpan lokasi tempat tinggal dari siswa.

berikut ini adalah sql query untuk membuat tabel siswa diatas

--
-- Table structure for table `siswa`
--
CREATE TABLE IF NOT EXISTS `siswa` (
`id_siswa` int(11) NOT NULL,
`nama_siswa` varchar(50) NOT NULL,
`alamat_siswa` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `siswa`
--
ALTER TABLE `siswa`
ADD PRIMARY KEY (`id_siswa`);
--
-- AUTO_INCREMENT for table `siswa`
--
ALTER TABLE `siswa`
MODIFY `id_siswa` int(11) NOT NULL AUTO_INCREMENT;

langkah 2 – membuat controller Siswa.php

buat file bernama siswa.php pada folder controller (code igniter). Controller tersebut harus memiliki fungsi untuk mengakomodasi ke empat fungsi yang telah didefinisikan diatas.

  1. Fungsi menambahkan siswa baru dengan lokasi url : (POST) {lokasi_web_services}/siswa
  2. Fungsi mengubah siswa baru dengan lokasi url : (PUT) {lokasi_web_services}/siswa/single/{id_siswa}
  3. Fungsi menghapus siswa dengan lokasi url : (DELETE) {lokasi_web_services}/siswa/singke/{id_siswa}
  4. Fungsi melihat data siswa dengan lokasi url : (GET) {lokasi_web_services}/siswa

berikut ini adalah kode controller untuk mengakomodasi fungsi-fungsi diatas :


include_once(APPPATH.'libraries/REST_Controller.php');
defined('BASEPATH') OR exit('No direct script access allowed');
class Siswa extends REST_Controller {

// Menambahkan data siswa (POST)
public function index_post(){

}

// Menampilkan data siswa(GET)
public function index_get(){

}


// Menghapus data siswa (DELETE)
public function single_delete($id_siswa = null){

}

// Mengubah data siswa (PUT)
public function single_put($id_siswa = null){

}


}

langkah 3 – membuat model.

setelah membuat controller , langkah selanjutnya adalah membuat model untuk menghubungkan web services dengan database sehingga dapat dilakukan proses manipulasi data. Namun sebelumnya pastikan bahwa code igniter telah dapat terkoneksi dengan database dengan melakukan konfigurasi di file database.php pada folder config. Lihat part-2 untuk mengkonfigurasi database.

pastikan pada file autoload.php(pada folder config) telah melakukan autoload untuk library database. jika lakukan set autoload database dengan menuliskan kode ini

$autoload['libraries'] = array('database');

 

buat file dengan nama Siswa_model.php , untuk proses query , ulasan ini menggunakan query builder yang telah disediakan oleh code igniter untuk mempercepat proses coding. Secara umum syntax yang digunakan adalah :

  1. $this->db->get() = untuk mengambil data pada database
  2. $this->db->insert() = untuk memasukan data pada database
  3. $this->db->update() = untuk mengupdate data pada database
  4. $this->db->delete() = untuk menghapus data pada database
  5. $this->db->where() = untuk menambahkan klausa query “where”

dokumentasi lengkap dapat dilihat di web resmi code igniter.

defined('BASEPATH') OR exit('No direct script access allowed');
class Siswa_model extends CI_Model {

private $response;

public function addSiswa($request){
// menambahkan data siswa berdasarkan data json pada request.
// data $request akan dimasukan pada fungsi addSiswa ini melalui controller.
$query = $this->insert('siswa', $request);
if($query){
// jika query pada database berhasil (tidak ada error) maka httpcode yang diberikan adalah 200(success) serta menampilkan data json yang digunakan untuk melakukan request.
$this->response['status_code'] = 200;
$this->response['status_message'] = "berhasil menambahkan data siswa";
$this->response['data'] = $request;
} else {
// jika query pada database gagal (terdapat error) maka menampilkan error dengan http code 500(internal server error)
$this->response['status_code'] =  500;
$this->response['status_message'] = $this->db->error();
}

// mengembalikan nilai request untuk diproses dicontroller sebagai http code dan respon dari web services
return $this->response;

}

public function editSiswa($id_siswa,$request){
// menambahkan data siswa berdasarkan data json pada request.
// data $request dan $is_siswa akan dimasukan pada fungsi editSiswa ini melalui controller.
$this->db->where('id_siswa', $id_siswa);
$query = $this->db->update('siswa', $request);
if($query){
// jika query pada database berhasil (tidak ada error) maka httpcode yang diberikan adalah 200(success) serta menampilkan data json yang digunakan untuk melakukan request.
$this->response['status_code'] = 200;
$this->response['status_message'] = "berhasil mengubah data siswa";
$this->response['data'] = $request;
} else {
// jika query pada database gagal (terdapat error) maka menampilkan error dengan http code 500(internal server error)
$this->response['status_code'] =  500;
$this->response['status_message'] = $this->db->error();
}

// mengembalikan nilai request untuk diproses dicontroller sebagai http code dan respon dari web services
return $this->response;

}

public function deleteSiswa($id_siswa){
// menambahkan data siswa berdasarkan data json pada request.
// data $request dan $is_siswa akan dimasukan pada fungsi deleteSiswa ini melalui controller.
$this->db->where('id_siswa', $id_siswa);
$query = $this->db->delete('siswa');
if($query){
// jika query pada database berhasil (tidak ada error) maka httpcode yang diberikan adalah 200(success) serta menampilkan data json yang digunakan untuk melakukan request.
$this->response['status_code'] = 200;
$this->response['status_message'] = "berhasil menghapus data siswa";
} else {
// jika query pada database gagal (terdapat error) maka menampilkan error dengan http code 500(internal server error)
$this->response['status_code'] =  500;
$this->response['status_message'] = $this->db->error();
}

// mengembalikan nilai request untuk diproses dicontroller sebagai http code dan respon dari web services
return $this->response;

}

public function getSiswa(){
$query = $this->db->get('siswa');
if($query){
// jika query pada database berhasil (tidak ada error) maka httpcode yang diberikan adalah 200(success) serta menampilkan data siswa.
$this->response['status_code'] = 200;
// menampilkan hasil query get pada tabel siswa.
$this->response['result'] = $query->result();
} else {
// jika query pada database gagal (terdapat error) maka menampilkan error dengan http code 500(internal server error)
$this->response['status_code'] =  500;
$this->response['status_message'] = $this->db->error();
}

// mengembalikan nilai request untuk diproses dicontroller sebagai http code dan respon dari web services
return $this->response;

}

}

langkah 4 – menghubungkan model dengan controller.

untuk membuat response pada controller di rest-server fungsi yang digunakan adalah :

$this->response(ISI_DARI_MESSAGE, HTTP_CODE)

pada ulasan ini, message dari httpcode dapatkan dari hasil return pada model Siswa yang berupa array. berikut ini ada kode untuk menghuubungkan controller dengan model.

include_once(APPPATH.'libraries/REST_Controller.php');
defined('BASEPATH') OR exit('No direct script access allowed');
class Siswa extends REST_Controller {

public function __construct(){
parent::__construct();
$this->load->model('Siswa_model');
}

// Menambahkan data siswa (POST)
public function index_post(){
$query = $this->Siswa_model->addSiswa($this->post());
$this->response($query, $query['status_code']);
}

// Menampilkan data siswa(GET)
public function index_get(){
$query = $this->Siswa_model->getSiswa();
$this->response($query, $query['status_code']);
}


// Menghapus data siswa (DELETE)
public function single_delete($id_siswa = null){
$query = $this->Siswa_model->deleteSiswa($id_siswa);
$this->response($query, $query['status_code']);
}

// Mengubah data siswa (PUT)
public function single_put($id_siswa = null){
$query = $this->Siswa_model->editSiswa($id_siswa,$this->put());
$this->response($query, $query['status_code']);
}


}
?>

 

langkah 5 – melakukan testing

 

  1. testing web services menambahkan siswa url : http://localhost/rest-server/siswa method : post
    input(JSON) :
    {
    "nama_siswa" : "degananda ferdian priyambada",
    "alamat_siswa" : "jl bla bla bla bla... surabaya"
    }
    screen-shot-2016-11-22-at-1-04-36-pm
  2. testing web services mengubah data siswa url : http://localhost/rest-server/siswa/single/{id_siswa} method : PUT
    input(JSON) :

    {
    "nama_siswa" : "muhammad furqon haq edit test",
    "alamat_siswa" : "jl bla bla bla bla... surabaya"
    }
    screen-shot-2016-11-22-at-1-08-08-pm
  3. testing web services menampilkan data siswa testing web services mengubah data siswa url : http://localhost/rest-server/siswa method : GET
    input(JSON) :
    tidak ada screen-shot-2016-11-22-at-1-10-50-pm
  4. testing web services menghapus data siswa testing web services mengubah data siswa url : http://localhost/rest-server/siswa/single/{id_siswa} method : DELETE
    input(JSON) :
    tidak ada screen-shot-2016-11-22-at-1-12-57-pm

langkah 6(tambahan) – menambahkan fungsi pagging+filter+search pada fungsi menampilkan data siswa(index_get()).

pada file Siswa_model.php tambahkan parameter class
private $max_per_page = 10;

kemudian ubah fungsi getSiswa() menjadi seperti ini

public function getSiswa($type, $page, $sortname, $sortvalue, $wherename, $wherevalue){
/*
Where Type.
[0] = Filter where
[1] = Filter search Like
*/
if($page <= 0){
$page = 0;
} else {
$page = ($page-1)*$this->max_per_page;
}
// get param of sortvalue (asceding or descending)
if($sortvalue != "desc" && $sortvalue != "null"){
$sortvalue = "asc";
}


// sort option
if($sortname != "null" && $sortvalue != "null"){
$this->db->order_by($sortname, $sortvalue);
}

// search option
if($type == 0 && ($wherename != "null" && $wherevalue != "null")){
$this->db->where($wherename, $wherevalue);
} else if($type == 1 && ($wherename != "null" && $wherevalue != "null")){
$this->db->like($wherename, $wherevalue);
}

$query_totaldata = $this->db->get('siswa');

// sort option
if($sortname != "null" && $sortvalue != "null"){
$this->db->order_by($sortname, $sortvalue);
}

// search option
if($type == 0 && ($wherename != "null" && $wherevalue != "null")){
$this->db->where($wherename, $wherevalue);
} else if($type == 1 && ($wherename != "null" && $wherevalue != "null")){
$this->db->like($wherename, $wherevalue);
}
$query = $this->db->get('siswa', $this->max_per_page, $page);

if($query && $query_totaldata){
// jika query pada database berhasil (tidak ada error) maka httpcode yang diberikan adalah 200(success) serta menampilkan data json.
$totaldata = $query_totaldata->num_rows();
$this->response['status_code'] =  500;
$this->response['result'] = $query->result();
$this->response['data']['totalhalaman'] = ceil($totaldata/$this->max_per_page);
$this->response['data']['totaldata'] = $totaldata;
} else {
// jika query pada database gagal (terdapat error) maka menampilkan error dengan http code 500(internal server error)
$this->response['status_code'] =  500;
$this->response['status_message'] = $this->db->error();
}

return $this->response;

}

 

pada intinnya, fungsi diatas mengakomdasi filter dengan search(klausa query “LIKE”) ataupun filter dengan klause “WHERE”.
max_per_page digunakan untuk membatasi jumlah data yang ditampilkan pada satu halaman.

ubah index_get() menjadi dua kontroller seperti dibawah ini.

public function view_get($page = null, $sortname = null, $sortvalue = null, $wherename = null, $wherevalue){
if($page == null || $sortname == null || $sortvalue == null || $wherename == null || $wherevalue == null){
$this->response('api parameter required', 500);
} else {
$query = $this->Siswa_model->getSiswa('0',$page, $sortname, $sortvalue, $wherename, $wherevalue);
$this->response($query, $query['status_code']);
}
}

public function search_get($page = null, $sortname = null, $sortvalue = null, $wherename = null, $wherevalue){
if($page == null || $sortname == null || $sortvalue == null || $wherename == null || $wherevalue == null){
$this->response('api parameter required', 500);
} else {
$query = $this->Siswa_model->getSiswa('1',$page, $sortname, $sortvalue, $wherename, $wherevalue);
$this->response($query, $query['status_code']);
}
}

sehingga url web services untuk menampilkan data siswa dengan filter menjadi :

{url_webservices}/siswa/VIEW/{halaman}/{nama_kolom_untuk_sort}/{value_sort_asc_atau_desc}/{nama_kolom_untuk_where}/{value_kolom_untuk_where}

atau untuk search(dengan klausa LIKE) adalah :

{url_webservices}/siswa/SEARCH/{halaman}/{nama_kolom_untuk_sort}/{value_sort_asc_atau_desc}/{nama_kolom_untuk_like}/{value_kolom_untuk_like}
  • http://localhost/rest-server/siswa/view/1/nama_siswa/desc/null/null -> web services akan menampilkan data siswa pada halaman pertama dengan mengurutkan berdasarkan nama siswa secara descending tanpa adannya filter(where).
  • http://localhost/rest-server/siswa/search/1/nama_siswa/desc/nama_siswa/wildan -> web services akan menampilkan data siswa pada halaman pertama dengan mengurutkan berdasarkan nama siswa secara descending dan hanya menampilkan nama yang mengandung kata wildan.

testing

url : http://localhost/rest-server/siswa/view/1/nama_siswa/desc/null/null
hasil :


{
"status_code": 500,
"result":
[
{
"id_siswa": "6",
"nama_siswa": "wildan radista",
"alamat_siswa": "lempuyangan"
},
{
"id_siswa": "5",
"nama_siswa": "muhammad furqon haq edit test",
"alamat_siswa": "jl bla bla bla bla... surabaya"
}
],
"data":
{
"totalhalaman": 1,
"totaldata": 2
}
}

 

url : http://localhost/rest-server/siswa/search/1/nama_siswa/desc/nama_siswa/wildan
hasil :


{
"status_code": 500,
"result":
[
{
"id_siswa": "6",
"nama_siswa": "wildan radista",
"alamat_siswa": "lempuyangan"
}
],
"data":
{
"totalhalaman": 1,
"totaldata": 1
}
}

hasil kode ulasan+database(sql) ini dapat diunduh di :
https://drive.google.com/open?id=0By5rvYirLfy3aUdpa2wzOFd0V0U

  • Pingback: Rest Webservices dengan code igniter menggunakan library rest-server (bagian 2) – setting API KEY – Degananda.com()

  • Rifqi alfurqan

    bro kok yang method putnya error ya?

    Error Number: 1064

    You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘`Content-Disposition:_form-data;_name` = ‘”nama_siswa”rnrnrifqi al ganteng’ at line 1

    UPDATE `siswa` SET `——WebKitFormBoundaryzYzuR8m5RICGlpyH` `Content-Disposition:_form-data;_name` = ‘”nama_siswa”rnrnrifqi al gantengrn——WebKitFormBoundaryzYzuR8m5RICGlpyHrnContent-Disposition: form-data; name=”alamat_siswa”rnrntangerang selatan bantenrn——WebKitFormBoundaryzYzuR8m5RICGlpyH–rn’ WHERE `id_siswa` = ‘1’

    Filename: C:/xampp/htdocs/rest-server2/system/database/DB_driver.php

    Line Number: 691

    • Si Sanca

      Wah sama, saya juga.. kabarin ya kalo udah ada solusinya… TS belum respon nih.. hehe

    • Si Sanca

      Setelah saya liat2 scriptnya, pas di method PUT, untuk data yang akan di inputnya di tulis dulu om. misal:
      $data_siswa=array(
      ‘nama_siswa’=>$this->put(‘nama_siswa),
      ‘alamat_siswa’=>$this->put(‘alamat_siswa’);
      );
      lalu di baris Query diganti.
      Semoga membantu, walaupun pertanyaan udah 7 bulan yang lalu. semoga membantu buat yang lain.. salam…

      http://sancaweb.com