Pengikut

Gundam Bertarung

Subscribe Admin

Kamis, 03 Agustus 2017

Membuat Rest API dengan Codeigniter




REST (REpresentational State Transfer) merupakan standar arsitektur komunikasi berbasis web yang sering diterapkan dalam pengembangan layanan berbasis web. Umumnya menggunakan HTTP (Hypertext Transfer Protocol) sebagai protocol untuk komunikasi data. REST pertama kali diperkenalkan oleh Roy Fielding pada tahun 2000.
Pada arsitektur REST, REST server menyediakan resources (sumber daya/data) dan REST client mengakses dan menampilkan resource tersebut untuk penggunaan selanjutnya. Setiap resource diidentifikasi oleh URIs (Universal Resource Identifiers) atau global ID. Resource tersebut direpresentasikan dalam bentuk format teks, JSON atau XML. Pada umumnya formatnya menggunakan JSON dan XML.
Web service adalah standar yang digunakan untuk melakukan pertukaran data antar aplikasi atau sistem, karena aplikasi yang melakukan pertukaran data bisa ditulis dengan bahasa pemrograman yang berbeda atau berjalan pada platform yang berbeda. Contoh implementasi dari web service antara lain adalah SOAP dan REST.
Pada kali ini saya akan memberikan sedikit tutorial mengenai “Cara membuat REST API dengan Codeigniter dan JWT (Json Web Token), bahan-bahan yang diperlukan adalah sebagai berikut:
·         Framework Codeigniter 3.1.5
Link: (
https://codeigniter.com/download).
·         Composer
Link: (
https://getcomposer.org/download/).
·         Library RESTServer
Link: (
https://github.com/chriskacerguis/codeigniter-restserver).
·         Library PHP-JWT
Link: (
https://github.com/firebase/php-jwt).

Membuat dan Konfigurasi Codeigniter

Unduh semua file yang digunakan lalu gabungkan file Codeigniter dengan Library Rest Server dalam satu folder.
Kemudian, install php-jwt menggunakan composer dengan cara klik kanan pada folder project codeigniter yang dibuat tadi lalu Open Command Window Here, atau buka cmd dan ketik seperti gambar dibawah ini.
composer require firebase/php-jwt

Hubungkan codeigniter dengan database yang sudah anda sediakan lalu ubah konfigurasi database pada application/config/database.php.



Buat file Rest.php didalam folder controller dan salin baris kode berikut ini:

Rest.php

defined('BASEPATH') OR exit('No direct script access allowed');

require APPPATH . '../vendor/autoload.php';
require APPPATH . '/libraries/REST_Controller.php';
use \Firebase\JWT\JWT;

class Rest extends REST_Controller {
    private $secretkey = 'kode_rahasia_kamu'; //ubah dengan kode rahasia apapun

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

    // method untuk melihat token pada user
    public function generate_post(){
        $this->load->model('loginmodel');
        $date = new DateTime();
        $username = $this->post('username',TRUE); //ini adalah kolom username pada database yang saya berinama username.
        $pass = $this->post('password',TRUE); //ini adalah kolom password pada database yang saya berinama password.
        $dataadmin = $this->loginmodel->is_valid($username);
        if ($dataadmin) {
            if (password_verify($pass,$dataadmin->password)) {
                $payload['id'] = $dataadmin->id_user;
                $payload['username'] = $dataadmin->username;
                $payload['iat'] = $date->getTimestamp(); //waktu di buat
                $payload['exp'] = $date->getTimestamp() + 3600; //satu jam
                $output['token'] = JWT::encode($payload,$this->secretkey);
                return $this->response($output,REST_Controller::HTTP_OK);
            } else {
                $this->viewtokenfail($username);
            }
        } else {
            $this->viewtokenfail($username);
        }
    }

    // method untuk jika generate token diatas salah
    public function viewtokenfail($username){
        $this->response([
          'status'=>FALSE,
          'username'=>$username,
          'message'=>'Invalid!'
          ],REST_Controller::HTTP_BAD_REQUEST);
    }

    // method untuk mengecek token setiap melakukan post, put, etc
    public function cektoken(){
        $this->load->model('loginmodel');
        $jwt = $this->input->get_request_header('Authorization');
        try {
            $decode = JWT::decode($jwt,$this->secretkey,array('HS256'));
            if ($this->loginmodel->is_valid_num($decode-> username)>0) {
                return true;
            }
        } catch (Exception $e) {
            exit('Wrong Token');
        }
    }

}
?>

Buat file Api.php didalam folder controller dan salin baris kode berikut:

Api.php

defined('BASEPATH') OR exit('No direct script access allowed');
  
require APPPATH . 'controllers/Rest.php';

class api extends Rest {

    function __construct($config = 'rest') {
        parent::__construct($config);
        $this->load->database();
        $this->cektoken();
    }

    /* index page */
    function index_get($table = '', $id = '') {
        if ($table == '') {
            redirect(base_url());
        } else {
            $get_id = 'id_'.$table;
            if ($id == '') {
            // baseurl/?table=nama_table (semua data)
                $data = $this->db->get($table)->result();
            } else {
            // baseurl/?table=nama_table&id=id (satu data)
                $this->db->where($get_id, $id);
                $data = $this->db->get($table)->result();
            }
            $this->response($data, 200);
        }
    }

    function index_post($table = '') { // baseurl/?table=nama_table
        $insert = $this->db->insert($table, $this->post());
        $id = $this->db->insert_id();
        if ($insert) {
            $response = array(
                'data' => $this->post(),
                'table' => $table,
                'id' => $id,
                'status' => 'success'
                );
            $this->response($response, 200);
        } else {
            $this->response(array('status' => 'fail', 502));
        }
    }

    function index_put($table = '', $id = '') { // baseurl/nama_table/id
        $get_id = 'id_'.$table;
        $this->db->where($get_id, $id);
        $update = $this->db->update($table, $this->put());
        if ($update) {
            $response = array(
                'data' => $this->put(),
                'table' => $table,
                'id' => $id,
                'status' => 'success'
                );
            $this->response($response, 200);
        } else {
            $this->response(array('status' => 'fail', 502));
        }
    }

    function index_delete($table = '', $id = '') {
        $get_id = 'id_'.$table;
        $this->db->where($get_id, $id);
        $delete = $this->db->delete($table);
        if ($delete) {
            $response = array(
                'table' => $table,
                'id' => $id,
                'status' => 'success'
                );
            $this->response($response, 201);
        } else {
            $this->response(array('status' => 'fail', 502));
        }
    }
}
?>
Buat file Loginmodel.php pada folder models dan salin baris code berikut
Loginmodel.php
defined('BASEPATH') OR exit('No direct script access allowed');
class Loginmodel extends CI_Model{
  public function __construct()
  {
    parent::__construct();
    $this->load->database();
  }
  public function is_valid($username){
    $this->db->select('*');
    $this->db->from('user_fadil');
    $this->db->where('username',$username);
    $query = $this->db->get();
    return $query->row();
  }
  public function is_valid_num($username){
    $this->db->select('*');
    $this->db->from('user_fadil');
    $this->db->where('username',$username);
    $query = $this->db->get();
    return $query->num_rows();
  }
}

Uji coba REST API dengan Postman

Disini saya akan menguji cobanya dengan Postman.
Generate token

Salin token lalu ke Headers dan tambahkan headers Authentication lalu isikan valuenya dengan token yang anda salin tadi.
Method GET dengan authentication header
Method POST

Method PUT
Method DELETE

0 komentar:

Profil Anda

My Facebook

 
Copyright© 2015 MFadilah | Template Blogger Designer by : Muhmmad Fadillah' |
Template Name | Uniqx Transparent Created By : Muhmmad Fadillah : Version 1.0 | Open new Daily