วันอังคารที่ 17 กันยายน พ.ศ. 2562

Yii2 Rest API

วิธีการแชร์ข้อมูลด้วย(Rest API+Security) โดย implement API ด้วย verb(POST,PUT,GET,DELETE)

kanitta kp
kanitta kp
Jul 29, 2017 · 5 min read
ภาพจากสไลด์วิชา 322433

ประโยชน์ของ RESTful API

— ทำการอยู่บน HTTP และทำตามมาตรฐานของ HTTP จึงทำให้พัฒนาได้ง่าย
— สนับสนุนรูปแบบข้อมูลมากมาย เช่น XML, JSON, Plain Text และอื่น ๆ อีกมากมาย
— รองรับเรื่อง caching ข้อมูล
— รองรับการขยายระบบได้ง่าย
— Stateless ทำงานโดยไม่ต้องมี session
ได้ที่ https://raw.githubusercontent.com/bahar/WorldCityLocations/master/World_Cities_Location_table.sql นำโค๊ดทั้งหมดในเว็บนี้ไปใส่ notepad ตั้งชื่อ location.sql แล้วทำการ import เข้า http://localhost/phpmyadmin
ตั้งชื่อดังภาพ เลือก All files และเลือก Encoding : UTF-8 ด้วย
จะได้ไฟล์ location.sql
ตั้งชื่อ location และเลือก utf8_unicode_ci กด create
เลือกไฟล์ location.sql แล้วกด go เพื่อ import DB
dbname=location;
เปิดหน้า localhost/ชื่อโปรเจค/web/gii จะได้หน้า Gii กด start ตรง Model Generator
พิมพ์ ตามรูป แล้วกด preview กด generate
จะได้ models Location มา
<?php
namespace app\models;

use Yii;

/**
 * This is the model class for table "location".
 *
 * @property integer $id
 * @property string $country
 * @property string $city
 * @property double $latitude
 * @property double $longitude
 * @property double $altitude
 */class Location extends \yii\db\ActiveRecord
{
    const SCENARIO_CREATE = 'create';
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'location';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['country', 'city', 'latitude', 'longitude', 'altitude'], 'required'],
            [['latitude', 'longitude', 'altitude'], 'number'],
            [['country'], 'string', 'max' => 25],
            [['city'], 'string', 'max' => 40],
        ];
    }
    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios['create'] = ['id','country','city','latitude','longitude','altitude']; //ต้องเหมือนใน database
        return $scenarios;
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'country' => 'Country',
            'city' => 'City',
            'latitude' => 'Latitude',
            'longitude' => 'Longitude',
            'altitude' => 'Altitude',
        ];
    }
}
เลือก Controller Generator กด start
<?php

namespace app\controllers;

use app\models\Location;
use yii\filters\ContentNegotiator;
use yii\rest\ActiveController;
use yii\web\Response;

class LocationController extends ActiveController
{
    public $enableCsrfValidation = false;

    public function behaviors()
    {
        return [
            [
                'class' => ContentNegotiator::className(),
                'only' => ['index', 'view'],
                'formats' => [
                    'application/json' => Response::FORMAT_JSON,
                ],
            ],
        ];
    }

    public $modelClass = 'app\models\Location';
    public $serializer = [
        'class' => 'yii\rest\Serializer',
        'collectionEnvelope' => 'items',
    ];

    public function actionPost() //create
    {
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        $location = new Location();
        $location->scenario = Location::SCENARIO_CREATE;
        $location->attributes = \yii::$app->request->post();
        if ($location->validate()) {
            $location->save();
            return array('status' => true, 'data' => 'Record is successfully updated');
        } else {
            return array('status' => false, 'data' => $location->getErrors());
        }
    }

    public function actionGet()
    {
        \Yii::$app->response->format = \yii\web\Response:: FORMAT_JSON;
        $location = Location::find()->all();
        if (count($location) > 0) {
            return array('status' => true, 'data' => $location);
        } else {
            return array('status' => false, 'data' => 'No Location Found');
        }
    }

    public function actionPut()
    {
        \Yii::$app->response->format = \yii\web\Response:: FORMAT_JSON;
        $attributes = \yii::$app->request->post();
        $location = Location::find()->where(['ID' => $attributes['id']])->one();
        if (count($location) > 0) {
            $location->attributes = \yii::$app->request->post();
            $location->save();
            return array('status' => true, 'data' => 'Location record is updated successfully');
        } else {
            return array('status' => false, 'data' => 'No Location Found');
        }
    }
    public function actionDeleteRoll()
    {
        \Yii::$app->response->format = \yii\web\Response:: FORMAT_JSON;
        $attributes = \yii::$app->request->post();
        $location = Location::find()->where(['ID' => $attributes['id']])->one();
        if (count($location) > 0) {
            $location->delete();
            return array('status' => true, 'data' => 'Location record is successfully deleted');
        } else {
            return array('status' => false, 'data' => 'No Location Found');
        }
    }


}
'parsers' => [
    'application/json' => 'yii\web\JsonParser',
]
กดลงโปรแกรมและเปิดโปรแกรมแล้วลงชื่อด้วย gmail ได้เลย
หน้าตา postman

GET

โดยใส่ URL: localhost/restapi/web/location เพื่อเรียก method get ใน controller ลงไปแล้วเลือกด้านหน้าในวงสีแดงเป็น get ด้วยนะ แล้วกด send ก็จะเป็นการ select ค่าทั้งหมดในตาราง location มาแสดงเป็น json ด้านล่าง

POST

PUT หรือ UPDATE นั่นเอง

เมื่อกด send แล้วจะแสดงข้อความนี้ แสดงว่าได้ทำการบันทึกแล้ว
เมื่อลอง get ค่าดูว่าข้อมูลเปลี่ยนหรือไม่

DELETE

พิมพ์ URL: localhost/restapi/web/location/delete-roll และเลือก delete ที่ด้านหน้า URL กด SEND และส่งค่า id ไป
เมื่อกดค้นหาจะไม่เจอตัวที่ delete ไปแล้ว


ไม่มีความคิดเห็น:

แสดงความคิดเห็น