Yii2 - Membuat RESTful web service

alfa6661
- December 14, 2015
5 (2 votes)
Rate :
Cara Membuat RESTful web service menggunakan Yii 2 Framework

REST (Representational State Transfer) Merupakan standard dalam arsitektur web yang menggunakan Protocol HTTP untuk pertukaran data. RESTful merupakan sebuah web service yang di implementasikan dengan menggunakan http dengan menggunakan prinsip-prinsip REST. Service yang digunakan menggunakan method milik http antara lain GET, PUT, POST, DELETE, dll. Secara sederhana, RESTful web service itu digunakan untuk membuat aplikasi berbasis client server yang basisnya web menggunakan HTTP protokol.

Dalam pengembangan aplikasi web terkadang kita perlu melakukan integrasi dengan pihak ketiga, salah satu cara untuk melakukannya adalah dengan RESTful. Dan pada artikel kali ini kita akan membahas cara membuat aplikasi Yii2 sebagai Web Service.

Database

Kita akan membuat table-table sederhana untuk tutorial ini.

Migration

Pertama, buatlah migration untuk membuat table-table di atas

table user

class m151214_051311_create_user extends Migration
{
    private $_table = 'user';
    public function up()
    {
        $this->createTable($this->_table, [
            'id' => $this->primaryKey(),
            'username' => $this->string()->notNull()->unique(),
            'auth_key' => $this->string(32)->notNull(),
            'password_hash' => $this->string()->notNull(),
            'password_reset_token' => $this->string()->unique(),
            'email' => $this->string()->notNull()->unique(),
            'status' => $this->smallInteger()->notNull()->defaultValue(10),
            'access_token' => $this->string(32)->notNull(),
            'created_at' => $this->integer()->notNull(),
            'updated_at' => $this->integer()->notNull()
        ]);
    }
    public function down()
    {
        $this->dropTable($this->_table);
    }
}

table book

<?php
use yii\db\Schema;
use yii\db\Migration;
class m151214_082501_create_book extends Migration
{
    private $_table = 'book';
    public function up()
    {
        $this->createTable($this->_table, [
            'id' => $this->primaryKey(),
            'title' => $this->string()->notNull()->unique(),
            'category' => $this->string(32)->notNull(),
            'user_id' => $this->integer(),
            'created_at' => $this->integer(),
            'updated_at' => $this->integer()
        ]);
        $this->addForeignKey('book_has_user', $this->_table, 'user_id', 'user', 'id', 'cascade', 'cascade');
    }
    public function down()
    {
        $this->dropTable($this->_table);
    }
}

Kemudian jalankan perintah ./yii migrate untuk membuat kedua table di atas.

Model

Model User

Untuk model user saya mengadopsi kode model user pada yii2 advanced dan menambahkan beberapa method yang di perlukan.

/**
 * @inheritdoc
 */
public static function findIdentityByAccessToken($token, $type = null)
{
    return static::findOne(['access_token' => $token]);
}
/**
 * Regenerate access token
 */
public function generateAccessToken()
{
    do {
        $this->access_token = Yii::$app->security->generateRandomString(32);
    } while (static::find()->where(['access_token' => $this->access_token])->exists());
    return $this->update(false, ['access_token']);
}

Model Book

Untuk model book kita menggunakan kode standar hasil generate gii.

Konfigurasi

pada konfigurasi, kita perlu mengubah response menjadi format json.

'components' => [
    'response' => [
        'format' => yii\web\Response::FORMAT_JSON,
        'charset' => 'UTF-8',
    ],
    // ..
]

UrlManager

Tambahkan controller yang akan digunakan (kita akan menggunakan BookController untuk proses CRUD model Book)

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'showScriptName' => true,
    'enablePrettyUrl' => true,
    'rules' => [
        [
            'class' => 'yii\rest\UrlRule', 
            'controller' => 'book'
        ]
    ],
],

Proses Login

LoginForm.php

Kita akan menggunakan field access_token untuk mendapatkan user yang sedang login. jadi saya menambahkan kode untuk generate ulang access_token ketika user login.

class LoginForm extends Model
{
    // ..............
    /**
     * Logs in a user using the provided username and password.
     * @return boolean whether the user is logged in successfully
     */
    public function login()
    {
        if ($this->validate()) {
            $user = $this->getUser();
            if($user->generateAccessToken()) {
                return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0);                
            }
            return false;
        }
        return false;
    }
    // ..............
}

Controller

<?php
namespace app\controllers;
use Yii;
use yii\rest\Controller;
use app\models\LoginForm;
class SiteController extends Controller
{
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
    public function actionLogin()
    {    
        $model = new LoginForm();
        if ($model->load(Yii::$app->getRequest()->getBodyParams(), '') && $model->login()) {
            return [
                'message' => 'Login sukses',
                'username' => Yii::$app->user->identity->username,
                'token' => Yii::$app->user->identity->access_token
            ];
        } else {
            return [
                'message' => 'Login gagal'
            ];
        }
    }
}

Response token dari proses login akan kita gunakan untuk proses authentikasi user.

Mendapatkan user yang login

Untuk melakukan test apakah token hasil dari proses login bekerja, kita bisa memeriksa dengan menampilkan output username pada actionIndex.

<?php
namespace app\controllers;
use Yii;
use yii\rest\Controller;
use app\models\LoginForm;
use yii\filters\auth\QueryParamAuth;
class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'authenticator' => [
                'class' => QueryParamAuth::className(),
                'except' => ['login']
            ]
        ];
    }
    // http://domain.com/site/index?access-token=<token>
    public function actionIndex()
    {
        return ["username" => Yii::$app->user->identity->username];
    }
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }    
    public function actionLogin()
    {    
        $model = new LoginForm();
        if ($model->load(Yii::$app->getRequest()->getBodyParams(), '') && $model->login()) {
            return [
                'message' => 'Login sukses',
                'username' => Yii::$app->user->identity->username,
                'token' => Yii::$app->user->identity->access_token
            ];
        } else {
            return [
                'message' => 'Login gagal'
            ];
        }
    }
}

Test dengan mengakses url http://domain.com/site/index?access-token=TOKEN_HASIL_LOGIN. Jika berhasil akan menghasilkan output username yang login.

Book Controller

Kita akan mengextends class ActiveController untuk controller Book.

<?php
namespace app\controllers;
use Yii;
use yii\filters\auth\QueryParamAuth;
class BookController extends \yii\rest\ActiveController
{
    public $modelClass = 'app\models\Book';
    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => QueryParamAuth::className(),
        ];
        return $behaviors;
    }
}

Cara akses untuk controller di atas :

GET /books: list all book page by page;
HEAD /books: show the overview information of book listing;
POST /books: create a new book;
GET /books/123: return the details of the book 123;
HEAD /books/123: show the overview information of book 123;
PATCH /books/123 and PUT /book/123: update the book 123;
DELETE /books/123: delete the book 123;
OPTIONS /books: show the supported verbs regarding endpoint /book;
OPTIONS /books/123: show the supported verbs regarding endpoint /book/123.

Contoh

Daftar Buku

Akses url: http://domain.com/books?access-token=TOKEN_HASIL_LOGIN

Detail Buku

Akses url: http://domain.com/books/ID?access-token=TOKEN_HASIL_LOGIN

Jika ID yang kita gunakan salah output akan menghasilkan output 404 error.

Tambah Buku

Akses url: http://domain.com/books?access-token=TOKEN_HASIL_LOGIN dengan method POST

Update Buku

Akses url: http://domain.com/books/ID?access-token=TOKEN_HASIL_LOGIN dengan method PUT

Hapus Buku

Akses url: http://domain.com/books/ID?access-token=TOKEN_HASIL_LOGIN dengan method DELETE

Cara Install

  • Extract hasil download dan copy ke direktori web anda
  • Masuk ke console dan jalankan composer update
  • jalankan perintah ./yii migrate
  • Lalu gunakan aplikasi untuk mengakses API (saya menggunakan postman untuk melakukan test)
  • Anda bisa login menggunakan username 123123 dan password 123123

Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter

– Eric S. Raymond

Have a better explanation?

If you have comments about this post. Please write your comments below

No comments associated with this article