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.
Kita akan membuat table-table sederhana untuk tutorial ini.
Pertama, buatlah migration untuk membuat table-table di atas
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); } }
<?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.
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']); }
Untuk model book kita menggunakan kode standar hasil generate gii.
pada konfigurasi, kita perlu mengubah response menjadi format json.
'components' => [ 'response' => [ 'format' => yii\web\Response::FORMAT_JSON, 'charset' => 'UTF-8', ], // .. ]
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' ] ], ],
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; } // .............. }
<?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.
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.
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.
Akses url: http://domain.com/books?access-token=TOKEN_HASIL_LOGIN
Akses url: http://domain.com/books/ID?access-token=TOKEN_HASIL_LOGIN
Jika ID yang kita gunakan salah output akan menghasilkan output 404 error.
Akses url: http://domain.com/books?access-token=TOKEN_HASIL_LOGIN dengan method POST
Akses url: http://domain.com/books/ID?access-token=TOKEN_HASIL_LOGIN dengan method PUT
Akses url: http://domain.com/books/ID?access-token=TOKEN_HASIL_LOGIN dengan method DELETE
0 comment
No comments associated with this article