RESTful API Design & Implementation with CodeIgniter PHP Framework

Bo-Yi Wu
Bo-Yi WuFull Stack & DevOps Engineer at MediaTek
RESTful API Design & Implementation with
     CodeIgniter PHP Framework
           2012 PHP Conference
Who Am I

   Bo-Yi Wu
   @appleboy
   http://blog.wu-boy.com

  任職於瑞昱半導體 RealTek(IC Design House)
  - TV 多媒體部門
  - Sencha Touch 2, Backbone.js, CodeIgniter,
    Node.js, MongoDB, MySQL, Twitter Bootstrap,
    Twitter Hogan ...

                      2012 PHPConf                2
Who Am I
●   Open Source Contributions (github: appleboy)
    –   CodeIgniter-Native-Session
    –   CodeIgniter-i18n
    –   CodeIgniter-Template
    –   CodeIgniter-Nexmo-Message
    –   CodeIgniter-TextMagic-API




                           2012 PHPConf            3
My Focus
●   CodeIgbiter 3.0.x develop branch
    –   Support Native Session
    –   Support HMVC
    –   Support Sparks Package Management System
●   Laravel develop branch
●   Javascript (Node.js, Socket.io, Express,
    Backbone.js)


                          2012 PHPConf             4
Outline
● Restful API Basic
● API Design


● Implementing API with CodeIgniter


● Verify your API




                2012 PHPConf          5
Restful API Basic


       2012 PHPConf   6
Why Use Restful?




          Restful API Service



                Database
                2012 PHPConf
             (MySQL,MongoDB)    7
What is REST? Http Method

●   POST
●   GET
●   PUT
●   DELETE
●   OPTIONS

              Define in RFC 2616


                    2012 PHPConf   8
並非所有的瀏覽器都支援
    PUT, DELETE
  http://api.jquery.com/jQuery.ajax/



               2012 PHPConf            9
如何解決未支援的瀏覽器


    2012 PHPConf   10
<input type='hidden' name='type' value='PUT'>




                   2012 PHPConf            11
將 PUT,DELETE 一併寫成 POST API



           2012 PHPConf   12
REST Response Format?
●   JSON*
●   XML
●   Array
●   Html
●   CSV




             2012 PHPConf   13
現在皆以 JSON 為主
  格式簡單 , 相容性高 , 閱讀方便



         2012 PHPConf   14
Javascript Object Notation


  {
       key1: 'value1',
       key2: 20121103
       key3: [1,2,3]
  }

               2012 PHPConf   15
JSON in Javascript is familiar


        var object = {
          key1: 'value1',
          key2: 20121103
          key3: [1,2,3]
        }
                 2012 PHPConf    16
JSON in PHP (encode)

         PHP                             Outputs
<?php
echo json_encode(array(                  {key: 'value'}
    'key' => 'value'
));




                          2012 PHPConf                    17
JSON in PHP (decode)

               PHP                         Outputs
<?php
$json_data = '{key: value}';            array(
                                             'key' => 'value'
echo json_decode({                      );
      'key' => 'value'
});



                         2012 PHPConf                           18
你不可不知的 JSON 基本介紹
     http://goo.gl/Wvhwb




          2012 PHPConf     19
API Design

    2012 PHPConf   20
良好的 API 設計
●   Simple 簡單
●   Intuitive 直觀的
●   Stable 穩定
●   Well Document 線上文件




                    2012 PHPConf   21
Using Facebook API


       2012 PHPConf   22
Fucking Stable and Document




           2012 PHPConf   23
請務必撰寫 API 線上文件


      2012 PHPConf   24
大家每天在花在討論的時間太長
   Debug 時間變少


      2012 PHPConf   25
良好的文件減少人與人溝通成本
     團隊合作




      2012 PHPConf   26
Http Method   RFC 2616


           CRUD                     Method
●   Create                     ●   POST
●   Read                       ●   GET
●   Update                     ●   PUT
●   Delete                     ●   DELETE




                    2012 PHPConf             27
API URL Define

     2012 PHPConf   28
/API/Module/Method


       2012 PHPConf   29
Format 1: Topic Module

● /API/Topic/Add
● /API/Topic/Update


● /API/Topic/Delete


● /API/Topic/List




               2012 PHPConf   30
Format 2: Topic Module

● /API/Topic/Add
● /API/Topic/Update/1234


● /API/Topic/Delete/1234


● /API/Topic/List/sort/asc




               2012 PHPConf   31
個人偏好格式 1

   2012 PHPConf   32
不用記住多種不同 API 格式


      2012 PHPConf   33
API Response Format


        2012 PHPConf   34
請勿常常修改 format
     ( 除非你想黑掉 )




       2012 PHPConf   35
Example Create API

          Input                          Output
var object = {               {
   title: 'value1',                  title: 'value1',
   type: 'value2',                   type: 'value2',
   user_id: '1000'                   user_id: '1000',
};                                   success_text: 'ok'
                             }

           http://site.com/API/Topic/Add
                      2012 PHPConf                        36
Example Create API

           Input                         Output
var object = {               {
   title: 'value1',                  title: 'value1',
   type: 'value2'                    type: 'value2',
};                                   user_id: '1000',
                                     success_text: 'ok'
                             }

        http://site.com/API/Topic/Add/1000
                      2012 PHPConf                        37
Example Update API

           Input                         Output
var object = {               {
   id: '1000',                       id: '1000',
   title: 'value1',                  title: 'value1',
   type: 'value2'                    type: 'value2',
};                                   success_text: 'ok'
                             }

          http://site.com/API/Topic/Update
                      2012 PHPConf                        38
Example Update API

           Input                         Output
var object = {               {
   title: 'value1',                  id: '1000',
   type: 'value2'                    title: 'value1',
};                                   type: 'value2',
                                     success_text: 'ok'
                             }

        http://site.com/API/Topic/Update/1000
                      2012 PHPConf                        39
Example Delete API (single)

         Input                          Output
var object = {              {
   id: 1000                         id: '1000',
};                                  success_text: 'ok'
                            }



         http://site.com/API/Topic/Delete
                     2012 PHPConf                        40
Example Delete API (multiple)

         Input                           Output
var object = {               {
   id: [1000, 1001]                  id: '1000',
};                                   success_text: 'ok'
                             }



         http://site.com/API/Topic/Delete
                      2012 PHPConf                        41
Example Delete API

          Input                         Output
var object = {              {
                                    id: '1000',
};                                  success_text: 'ok'
                            }



        http://site.com/API/Topic/Delete/1000
                     2012 PHPConf                        42
Example Read API (Single)

         Input                            Output
var object = {               {
   id: 1000                          id: '1000',
};                                   success_text: 'ok',
                                     item: {
                                        title: 'Kate Upton'
                                     }
                             }
            http://site.com/API/Topic/List
                      2012 PHPConf                        43
Example Search API (Multiple)

         Input              {            Output
var object = {                      id: '1000',
   q: 'Kate Upton'                  success_text: 'ok',
};                                  items: [
                                       {title: 'I am kate'},
                                       {title: 'I am Upton'}
                                    ]
                         }
           http://site.com/API/Topic/List
                     2012 PHPConf                        44
Kate                  Upton



       2012 PHPConf      45
多虧了 Youtube API 讓我在上班時增加了很多動力




            2012 PHPConf   46
How to handle versioning?



           2012 PHPConf   47
內部 API 大改版

    2012 PHPConf   48
Old: http://site.com/v1/API/Topic/Add
New: http://site.com/v2/API/Topic/Add



                2012 PHPConf       49
利用 URI Routing 功能
Framework or mod_rewrite


          2012 PHPConf   50
http://site.com/API/Topic/Add

               = 
http://site.com/v1/API/Topic/Add

              2012 PHPConf         51
API Implementation


       2012 PHPConf   52
不用自己造輪子

   2012 PHPConf   53
Phil Sturgeon’s
        CodeIgniter REST Server
http://github.com/philsturgeon/codeigniter-restserver



                       2012 PHPConf                54
Requirements
●   PHP 5.2 or greater
●   CodeIgniter 2.1.x to 3.0-dev




                         2012 PHPConf   55
How to install?

      2012 PHPConf   56
Installation
●   Drag and drop the following files into your
    application's directories
    –   application/libraries/Format.php
    –   application/libraries/REST_Controller.php
    –   application/config/rest.php




                            2012 PHPConf            57
Setup the config
●   $config['rest_default_format'] = 'json';
●   $config['rest_enable_keys'] = false;
●   $config['rest_enable_logging'] = false;
●   $config['rest_enable_limits'] = false;
●   $config['rest_ajax_only'] = false;




                         2012 PHPConf          58
Include REST Controller



          2012 PHPConf   59
require(APPPATH.'/libraries/REST_Controller.php');




                      2012 PHPConf            60
Handling Requests

class Topic extends REST_Controller
{
  public function index_get() {}
  public function index_post() {}
  public function index_update() {}
  public function index_delete() {}
}


                   2012 PHPConf       61
CRUD Requests

class Topic extends REST_Controller
{
  public function list_get() {}
  public function add_post() {}
  public function update_update() {}
  public function delete_delete() {}
}


                   2012 PHPConf        62
Accessing parameters is also easy




              2012 PHPConf     63
Parameters
● GET
  – $this->get('blah');
● POST


  – $this->post('blah');
● UPDATE


  – $this->update('blah');
● DELETE


  – $this->delete('blah');
                    2012 PHPConf   64
Create API

           Input                               Output
var object = {                     {
   title: 'Kate Upton',                    id: '1000',
   text: 'Beautiful girl'                  success_text: 'ok',
};                                 }



            http://site.com/API/Topic/Add
                            2012 PHPConf                         65
Create API (POST)

public function Add_post()
{
  if (!$this->post('title')) {
      $this->response(array('error' => 'Title is required'), 404);
  }

    $output = $this->lib_topic->insert($data);

    if ($output) {
        $this->response($output, 200);
    } else {
        $this->response(array('error' => 'Insert error'), 404);
    }
}
                                2012 PHPConf                         66
Update API

           Input                               Output
var object = {                     {
   id: 1000,                               id: '1000',
   title: 'Kate Upton',                    success_text: 'ok',
   text: 'Beautiful girl'          }
};


          http://site.com/API/Topic/Update
                            2012 PHPConf                         67
Update API (PUT)

public function Update_put()
{
  if (!$this->update('id')) {
      $this->response(array('error' => 'ID is required'), 404);
  }

    $output = $this->lib_topic->update($this->update('id'), $data);

    if ($output) {
        $this->response($output, 200);
    } else {
        $this->response(array('error' => 'Insert error'), 404);
    }
}
                                2012 PHPConf                          68
Delete API

         Input                          Output
var object = {              {
   id: 1000                         id: '1000',
};                                  success_text: 'ok',
                            }



         http://site.com/API/Topic/Delete
                     2012 PHPConf                         69
Delete API (DELETE)

public function Delete_delete()
{
  if (!$this->delete('id')) {
      $this->response(array('error' => 'ID is required'), 404);
  }

    $output = $this->lib_topic->delete($this->delete('id'));

    if ($output) {
        $this->response($output, 200);
    } else {
        $this->response(array('error' => 'Insert error'), 404);
    }
}
                                2012 PHPConf                      70
Read API (GET)

          Input                            Output
var object = {                {
   id: 1000,                          id: '1000',
   type: [1, 2]                       success_text: 'ok',
};                                    item: {
                                         title: 'Kate Upton'
                                      }
                              }
             http://site.com/API/Topic/List
                       2012 PHPConf                        71
Read API (GET)

public function List_get()
{
  if (!$this->get('id') or ) {
      $this->response(array('error' => 'ID is required'), 404);
  }

    $output = $this->lib_topic->list($this->get('id'), $this->get('type'));

    if ($output) {
        $this->response($output, 200);
    } else {
        $this->response(array('error' => 'Insert error'), 404);
    }
}
                                2012 PHPConf                            72
目錄結構

 2012 PHPConf   73
Folder

 application
    controllers/
      api/
       topic.php
       user.php
       acl.php
 system
 index.php

                   2012 PHPConf   74
Routing (config/routes.php)

 Default URL http://site.com/api/topic/Add

  $route['API/Topic/(:any)'] = 'api/topic/$1';
  $route['API/User/(:any)'] = 'api/user/$1';
  $route['API/Acl/(:any)'] = 'api/acl/$1';

 New URL http://site.com/API/Topic/Add


                    2012 PHPConf                 75
Verify Your API

      2012 PHPConf   76
一樣不需要自己造輪子

    2012 PHPConf   77
Phil Sturgeon’s
         CodeIgniter REST Client
https://github.com/philsturgeon/codeigniter-restclient



                       2012 PHPConf                 78
Requirements

     2012 PHPConf   79
Requirements
●   PHP 5.1+
●   CodeIgniter 2.0.0+
●   CURL
●   CodeIgniter Curl library:
    http://getsparks.org/packages/curl/show




                         2012 PHPConf         80
Load Rest Client Library



          2012 PHPConf   81
Load Library

// Load the rest client spark
$this->load->spark('restclient/2.1.0');

// Load the library
$this->load->library('rest');




                  2012 PHPConf            82
Setup API Server

// Run some setup
$this->rest->initial('xxxxxx');

// twitter server
$this->load->initial('http://twitter.com');




                  2012 PHPConf           83
Parameter

// set api path
$api = '/API/Topic/Add';

// set api data
$data = array(
   'title' => 'I am Kate Upton',
   'type' => 'girl'
);



                  2012 PHPConf     84
Test it


// GET API
$this->rest->get($api, $data);
// POST API
$this->rest->post($api, $data);
// UPDATE API
$this->rest->update($api, $data);
// DELETE API
$this->rest->delete($api, $data);

               2012 PHPConf         85
$this->rest->debug();
     Rest Client Library debug mode




                 2012 PHPConf         86
以上是 CodeIgniter PHP Framework




            2012 PHPConf   87
Implement another Framework?




            2012 PHPConf   88
Laravel PHP Framework?



         2012 PHPConf   89
public $restful = true;

          2012 PHPConf   90
class Home_Controller extends Base_Controller
{
   public $restful = true;

    public function get_index()
    {
      //
    }

    public function post_index()
    {
      //
    }
                       2012 PHPConf         91
}
More Introduction to Laravel Framework
               14:20 – 14:50
用 Laravel Framework 打造現代化網站應用程式
                大澤木小鐵




                  2012 PHPConf         92
RESTful API 就講到這裡


       2012 PHPConf   93
如果有任何問題

   2012 PHPConf   94
可以上 CodeIgniter 論壇


        2012 PHPConf   95
http://www.codeigniter.org.tw/forum/



               2012 PHPConf       96
謝謝大家及工作團隊

    2012 PHPConf   97
1 of 97

Recommended

REST API Best Practices & Implementing in Codeigniter by
REST API Best Practices & Implementing in CodeigniterREST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterSachin G Kulkarni
39.4K views31 slides
5 Purchasing Overview.ppt by
5  Purchasing Overview.ppt5  Purchasing Overview.ppt
5 Purchasing Overview.pptHariniYarlagadda1
50 views48 slides
Complete Oracle Procure to Pay Cycle by
Complete Oracle Procure to Pay Cycle Complete Oracle Procure to Pay Cycle
Complete Oracle Procure to Pay Cycle mgarg82
14K views15 slides
REST API by
REST APIREST API
REST APITofazzal Ahmed
1.9K views17 slides
Extensions in OAF by
Extensions in OAF Extensions in OAF
Extensions in OAF iWare Logic Technologies Pvt. Ltd.
8.6K views23 slides
ASP.NET Web API by
ASP.NET Web APIASP.NET Web API
ASP.NET Web APIhabib_786
7.1K views39 slides

More Related Content

What's hot

Oracle SCM Purchasing R12 by
Oracle SCM Purchasing R12Oracle SCM Purchasing R12
Oracle SCM Purchasing R12Zabi Khan
1K views41 slides
Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur... by
Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur...Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur...
Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur...Amit Singh
1.8K views55 slides
Oracle Time and Labor (OTL) Setup for Project by
Oracle Time and Labor (OTL) Setup for ProjectOracle Time and Labor (OTL) Setup for Project
Oracle Time and Labor (OTL) Setup for Projectiavinashpatel
3.5K views19 slides
Oracle EBS R12 Payroll user manual by
Oracle EBS R12 Payroll user manualOracle EBS R12 Payroll user manual
Oracle EBS R12 Payroll user manualFeras Ahmad
1.1K views96 slides
Oaf personalization examples by
Oaf personalization examplesOaf personalization examples
Oaf personalization examplesMadhurima Chatterjee
7.7K views99 slides
RESTful API - Best Practices by
RESTful API - Best PracticesRESTful API - Best Practices
RESTful API - Best PracticesTricode (part of Dept)
2.6K views20 slides

What's hot(20)

Oracle SCM Purchasing R12 by Zabi Khan
Oracle SCM Purchasing R12Oracle SCM Purchasing R12
Oracle SCM Purchasing R12
Zabi Khan1K views
Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur... by Amit Singh
Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur...Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur...
Oracle EBS 12.1.3 : Integrate OA Framework BC4J components within java concur...
Amit Singh1.8K views
Oracle Time and Labor (OTL) Setup for Project by iavinashpatel
Oracle Time and Labor (OTL) Setup for ProjectOracle Time and Labor (OTL) Setup for Project
Oracle Time and Labor (OTL) Setup for Project
iavinashpatel3.5K views
Oracle EBS R12 Payroll user manual by Feras Ahmad
Oracle EBS R12 Payroll user manualOracle EBS R12 Payroll user manual
Oracle EBS R12 Payroll user manual
Feras Ahmad1.1K views
Richardson Maturity and OpenAPI 3.0 by SmartBear
Richardson Maturity and OpenAPI 3.0Richardson Maturity and OpenAPI 3.0
Richardson Maturity and OpenAPI 3.0
SmartBear805 views
Otbi and bicc_psr_technote_v3_final_document by HamadaAsmrAladham1
Otbi and bicc_psr_technote_v3_final_documentOtbi and bicc_psr_technote_v3_final_document
Otbi and bicc_psr_technote_v3_final_document
HamadaAsmrAladham1549 views
REST-API introduction for developers by Patrick Savalle
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developers
Patrick Savalle5.5K views
Accrual plan set up in oracle hrms by Rajiv reddy
Accrual plan set up in oracle hrmsAccrual plan set up in oracle hrms
Accrual plan set up in oracle hrms
Rajiv reddy8.3K views
Oracle Forms :Window and Canvases by Sekhar Byna
Oracle Forms :Window and CanvasesOracle Forms :Window and Canvases
Oracle Forms :Window and Canvases
Sekhar Byna6.3K views
Oracle EBS R 12 Core hr user manual by Feras Ahmad
Oracle EBS R 12 Core hr user manualOracle EBS R 12 Core hr user manual
Oracle EBS R 12 Core hr user manual
Feras Ahmad831 views
Oracle learning management by Feras Ahmad
Oracle learning managementOracle learning management
Oracle learning management
Feras Ahmad2K views
Oracle EBS r12-2-6 New Features by Feras Ahmad
Oracle EBS r12-2-6 New FeaturesOracle EBS r12-2-6 New Features
Oracle EBS r12-2-6 New Features
Feras Ahmad1.4K views
Salesforce DUG - Queueable Apex by Akshay Varu
Salesforce DUG - Queueable ApexSalesforce DUG - Queueable Apex
Salesforce DUG - Queueable Apex
Akshay Varu762 views
People soft workflow by surya 2 by meghamystic
People soft workflow by surya 2People soft workflow by surya 2
People soft workflow by surya 2
meghamystic3.9K views

Similar to RESTful API Design & Implementation with CodeIgniter PHP Framework

Api details for american syscorp by
Api details for american syscorpApi details for american syscorp
Api details for american syscorpCarmor Bass
268 views97 slides
API Details For Ascitconsultancyservices.com by
API Details For Ascitconsultancyservices.comAPI Details For Ascitconsultancyservices.com
API Details For Ascitconsultancyservices.comCarmor Bass
140 views97 slides
Api guide by
Api guide Api guide
Api guide Deepak Rai
71 views21 slides
Introduction to the Pods JSON API by
Introduction to the Pods JSON APIIntroduction to the Pods JSON API
Introduction to the Pods JSON APIpodsframework
6.7K views23 slides
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani by
Creating REST Applications with the Slim Micro-Framework by Vikram VaswaniCreating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswanivvaswani
39.9K views62 slides
Swift LA Meetup at eHarmony- What's New in Swift 2.0 by
Swift LA Meetup at eHarmony- What's New in Swift 2.0Swift LA Meetup at eHarmony- What's New in Swift 2.0
Swift LA Meetup at eHarmony- What's New in Swift 2.0Claire Townend Gee
983 views16 slides

Similar to RESTful API Design & Implementation with CodeIgniter PHP Framework(20)

Api details for american syscorp by Carmor Bass
Api details for american syscorpApi details for american syscorp
Api details for american syscorp
Carmor Bass268 views
API Details For Ascitconsultancyservices.com by Carmor Bass
API Details For Ascitconsultancyservices.comAPI Details For Ascitconsultancyservices.com
API Details For Ascitconsultancyservices.com
Carmor Bass140 views
Introduction to the Pods JSON API by podsframework
Introduction to the Pods JSON APIIntroduction to the Pods JSON API
Introduction to the Pods JSON API
podsframework6.7K views
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani by vvaswani
Creating REST Applications with the Slim Micro-Framework by Vikram VaswaniCreating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani
vvaswani39.9K views
Swift LA Meetup at eHarmony- What's New in Swift 2.0 by Claire Townend Gee
Swift LA Meetup at eHarmony- What's New in Swift 2.0Swift LA Meetup at eHarmony- What's New in Swift 2.0
Swift LA Meetup at eHarmony- What's New in Swift 2.0
Claire Townend Gee983 views
Découplez votre appli en micro-APIs by Nicolas Blanco
Découplez votre appli en micro-APIsDécouplez votre appli en micro-APIs
Découplez votre appli en micro-APIs
Nicolas Blanco8.1K views
soscon2018 - Tracing for fun and profit by hanbeom Park
soscon2018 - Tracing for fun and profitsoscon2018 - Tracing for fun and profit
soscon2018 - Tracing for fun and profit
hanbeom Park56 views
Itb 2021 - Bulding Quick APIs by Gavin Pickin by Gavin Pickin
Itb 2021 - Bulding Quick APIs by Gavin PickinItb 2021 - Bulding Quick APIs by Gavin Pickin
Itb 2021 - Bulding Quick APIs by Gavin Pickin
Gavin Pickin179 views
O365 Saturday - Deepdive SharePoint Client Side Rendering by Riwut Libinuko
O365 Saturday - Deepdive SharePoint Client Side RenderingO365 Saturday - Deepdive SharePoint Client Side Rendering
O365 Saturday - Deepdive SharePoint Client Side Rendering
Riwut Libinuko1K views
PHP MVC Tutorial by Yang Bruce
PHP MVC TutorialPHP MVC Tutorial
PHP MVC Tutorial
Yang Bruce2.8K views
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later by Haehnchen
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years laterSymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
Haehnchen1.7K views
A Closer Look At React Native by Ian Wang
A Closer Look At React NativeA Closer Look At React Native
A Closer Look At React Native
Ian Wang730 views
Mirage For Beginners by Wilson Su
Mirage For BeginnersMirage For Beginners
Mirage For Beginners
Wilson Su231 views
Running gRPC Services for Serving Legacy API on Kubernetes by Sungwon Lee
Running gRPC Services for Serving Legacy API on KubernetesRunning gRPC Services for Serving Legacy API on Kubernetes
Running gRPC Services for Serving Legacy API on Kubernetes
Sungwon Lee723 views
Introducing the All New RESTful API for API Management by WSO2
Introducing the All New RESTful API for API ManagementIntroducing the All New RESTful API for API Management
Introducing the All New RESTful API for API Management
WSO21.4K views
[4developers2016] PHP 7 (Michał Pipa) by PROIDEA
[4developers2016] PHP 7 (Michał Pipa)[4developers2016] PHP 7 (Michał Pipa)
[4developers2016] PHP 7 (Michał Pipa)
PROIDEA174 views

More from Bo-Yi Wu

Drone CI/CD 自動化測試及部署 by
Drone CI/CD 自動化測試及部署Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署Bo-Yi Wu
1.5K views95 slides
用 Go 語言打造多台機器 Scale 架構 by
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構Bo-Yi Wu
3.6K views64 slides
Job Queue in Golang by
Job Queue in GolangJob Queue in Golang
Job Queue in GolangBo-Yi Wu
22.3K views82 slides
Golang Project Layout and Practice by
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and PracticeBo-Yi Wu
19.3K views94 slides
Introduction to GitHub Actions by
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub ActionsBo-Yi Wu
19.3K views57 slides
Drone 1.0 Feature by
Drone 1.0 FeatureDrone 1.0 Feature
Drone 1.0 FeatureBo-Yi Wu
8.2K views40 slides

More from Bo-Yi Wu(20)

Drone CI/CD 自動化測試及部署 by Bo-Yi Wu
Drone CI/CD 自動化測試及部署Drone CI/CD 自動化測試及部署
Drone CI/CD 自動化測試及部署
Bo-Yi Wu1.5K views
用 Go 語言打造多台機器 Scale 架構 by Bo-Yi Wu
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構
Bo-Yi Wu3.6K views
Job Queue in Golang by Bo-Yi Wu
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
Bo-Yi Wu22.3K views
Golang Project Layout and Practice by Bo-Yi Wu
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
Bo-Yi Wu19.3K views
Introduction to GitHub Actions by Bo-Yi Wu
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
Bo-Yi Wu19.3K views
Drone 1.0 Feature by Bo-Yi Wu
Drone 1.0 FeatureDrone 1.0 Feature
Drone 1.0 Feature
Bo-Yi Wu8.2K views
Drone CI/CD Platform by Bo-Yi Wu
Drone CI/CD PlatformDrone CI/CD Platform
Drone CI/CD Platform
Bo-Yi Wu8.8K views
GraphQL IN Golang by Bo-Yi Wu
GraphQL IN GolangGraphQL IN Golang
GraphQL IN Golang
Bo-Yi Wu10.5K views
Go 語言基礎簡介 by Bo-Yi Wu
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介
Bo-Yi Wu11.4K views
drone continuous Integration by Bo-Yi Wu
drone continuous Integrationdrone continuous Integration
drone continuous Integration
Bo-Yi Wu7.4K views
Gorush: A push notification server written in Go by Bo-Yi Wu
Gorush: A push notification server written in GoGorush: A push notification server written in Go
Gorush: A push notification server written in Go
Bo-Yi Wu13.7K views
用 Drone 打造 輕量級容器持續交付平台 by Bo-Yi Wu
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
Bo-Yi Wu36.2K views
用 Go 語言 打造微服務架構 by Bo-Yi Wu
用 Go 語言打造微服務架構用 Go 語言打造微服務架構
用 Go 語言 打造微服務架構
Bo-Yi Wu10.7K views
Introduction to Gitea with Drone by Bo-Yi Wu
Introduction to Gitea with DroneIntroduction to Gitea with Drone
Introduction to Gitea with Drone
Bo-Yi Wu11.9K views
運用 Docker 整合 Laravel 提升團隊開發效率 by Bo-Yi Wu
運用 Docker 整合 Laravel 提升團隊開發效率運用 Docker 整合 Laravel 提升團隊開發效率
運用 Docker 整合 Laravel 提升團隊開發效率
Bo-Yi Wu5K views
用 Go 語言實戰 Push Notification 服務 by Bo-Yi Wu
用 Go 語言實戰 Push Notification 服務用 Go 語言實戰 Push Notification 服務
用 Go 語言實戰 Push Notification 服務
Bo-Yi Wu5K views
用 Go 語言打造 DevOps Bot by Bo-Yi Wu
用 Go 語言打造 DevOps Bot用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
Bo-Yi Wu5.2K views
A painless self-hosted Git service: Gitea by Bo-Yi Wu
A painless self-hosted Git service: GiteaA painless self-hosted Git service: Gitea
A painless self-hosted Git service: Gitea
Bo-Yi Wu15.4K views
Write microservice in golang by Bo-Yi Wu
Write microservice in golangWrite microservice in golang
Write microservice in golang
Bo-Yi Wu14.8K views
用 Docker 改善團隊合作模式 by Bo-Yi Wu
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式
Bo-Yi Wu7.2K views

RESTful API Design & Implementation with CodeIgniter PHP Framework

  • 1. RESTful API Design & Implementation with CodeIgniter PHP Framework 2012 PHP Conference
  • 2. Who Am I Bo-Yi Wu @appleboy http://blog.wu-boy.com 任職於瑞昱半導體 RealTek(IC Design House) - TV 多媒體部門 - Sencha Touch 2, Backbone.js, CodeIgniter, Node.js, MongoDB, MySQL, Twitter Bootstrap, Twitter Hogan ... 2012 PHPConf 2
  • 3. Who Am I ● Open Source Contributions (github: appleboy) – CodeIgniter-Native-Session – CodeIgniter-i18n – CodeIgniter-Template – CodeIgniter-Nexmo-Message – CodeIgniter-TextMagic-API 2012 PHPConf 3
  • 4. My Focus ● CodeIgbiter 3.0.x develop branch – Support Native Session – Support HMVC – Support Sparks Package Management System ● Laravel develop branch ● Javascript (Node.js, Socket.io, Express, Backbone.js) 2012 PHPConf 4
  • 5. Outline ● Restful API Basic ● API Design ● Implementing API with CodeIgniter ● Verify your API 2012 PHPConf 5
  • 6. Restful API Basic 2012 PHPConf 6
  • 7. Why Use Restful? Restful API Service Database 2012 PHPConf (MySQL,MongoDB) 7
  • 8. What is REST? Http Method ● POST ● GET ● PUT ● DELETE ● OPTIONS Define in RFC 2616 2012 PHPConf 8
  • 9. 並非所有的瀏覽器都支援 PUT, DELETE http://api.jquery.com/jQuery.ajax/ 2012 PHPConf 9
  • 11. <input type='hidden' name='type' value='PUT'> 2012 PHPConf 11
  • 12. 將 PUT,DELETE 一併寫成 POST API 2012 PHPConf 12
  • 13. REST Response Format? ● JSON* ● XML ● Array ● Html ● CSV 2012 PHPConf 13
  • 14. 現在皆以 JSON 為主 格式簡單 , 相容性高 , 閱讀方便 2012 PHPConf 14
  • 15. Javascript Object Notation { key1: 'value1', key2: 20121103 key3: [1,2,3] } 2012 PHPConf 15
  • 16. JSON in Javascript is familiar var object = { key1: 'value1', key2: 20121103 key3: [1,2,3] } 2012 PHPConf 16
  • 17. JSON in PHP (encode) PHP Outputs <?php echo json_encode(array( {key: 'value'} 'key' => 'value' )); 2012 PHPConf 17
  • 18. JSON in PHP (decode) PHP Outputs <?php $json_data = '{key: value}'; array( 'key' => 'value' echo json_decode({ ); 'key' => 'value' }); 2012 PHPConf 18
  • 19. 你不可不知的 JSON 基本介紹 http://goo.gl/Wvhwb 2012 PHPConf 19
  • 20. API Design 2012 PHPConf 20
  • 21. 良好的 API 設計 ● Simple 簡單 ● Intuitive 直觀的 ● Stable 穩定 ● Well Document 線上文件 2012 PHPConf 21
  • 22. Using Facebook API 2012 PHPConf 22
  • 23. Fucking Stable and Document 2012 PHPConf 23
  • 25. 大家每天在花在討論的時間太長 Debug 時間變少 2012 PHPConf 25
  • 26. 良好的文件減少人與人溝通成本 團隊合作 2012 PHPConf 26
  • 27. Http Method RFC 2616 CRUD Method ● Create ● POST ● Read ● GET ● Update ● PUT ● Delete ● DELETE 2012 PHPConf 27
  • 28. API URL Define 2012 PHPConf 28
  • 29. /API/Module/Method 2012 PHPConf 29
  • 30. Format 1: Topic Module ● /API/Topic/Add ● /API/Topic/Update ● /API/Topic/Delete ● /API/Topic/List 2012 PHPConf 30
  • 31. Format 2: Topic Module ● /API/Topic/Add ● /API/Topic/Update/1234 ● /API/Topic/Delete/1234 ● /API/Topic/List/sort/asc 2012 PHPConf 31
  • 32. 個人偏好格式 1 2012 PHPConf 32
  • 34. API Response Format 2012 PHPConf 34
  • 35. 請勿常常修改 format ( 除非你想黑掉 ) 2012 PHPConf 35
  • 36. Example Create API Input Output var object = { { title: 'value1', title: 'value1', type: 'value2', type: 'value2', user_id: '1000' user_id: '1000', }; success_text: 'ok' } http://site.com/API/Topic/Add 2012 PHPConf 36
  • 37. Example Create API Input Output var object = { { title: 'value1', title: 'value1', type: 'value2' type: 'value2', }; user_id: '1000', success_text: 'ok' } http://site.com/API/Topic/Add/1000 2012 PHPConf 37
  • 38. Example Update API Input Output var object = { { id: '1000', id: '1000', title: 'value1', title: 'value1', type: 'value2' type: 'value2', }; success_text: 'ok' } http://site.com/API/Topic/Update 2012 PHPConf 38
  • 39. Example Update API Input Output var object = { { title: 'value1', id: '1000', type: 'value2' title: 'value1', }; type: 'value2', success_text: 'ok' } http://site.com/API/Topic/Update/1000 2012 PHPConf 39
  • 40. Example Delete API (single) Input Output var object = { { id: 1000 id: '1000', }; success_text: 'ok' } http://site.com/API/Topic/Delete 2012 PHPConf 40
  • 41. Example Delete API (multiple) Input Output var object = { { id: [1000, 1001] id: '1000', }; success_text: 'ok' } http://site.com/API/Topic/Delete 2012 PHPConf 41
  • 42. Example Delete API Input Output var object = { { id: '1000', }; success_text: 'ok' } http://site.com/API/Topic/Delete/1000 2012 PHPConf 42
  • 43. Example Read API (Single) Input Output var object = { { id: 1000 id: '1000', }; success_text: 'ok', item: { title: 'Kate Upton' } } http://site.com/API/Topic/List 2012 PHPConf 43
  • 44. Example Search API (Multiple) Input { Output var object = { id: '1000', q: 'Kate Upton' success_text: 'ok', }; items: [ {title: 'I am kate'}, {title: 'I am Upton'} ] } http://site.com/API/Topic/List 2012 PHPConf 44
  • 45. Kate Upton 2012 PHPConf 45
  • 46. 多虧了 Youtube API 讓我在上班時增加了很多動力 2012 PHPConf 46
  • 47. How to handle versioning? 2012 PHPConf 47
  • 48. 內部 API 大改版 2012 PHPConf 48
  • 50. 利用 URI Routing 功能 Framework or mod_rewrite 2012 PHPConf 50
  • 51. http://site.com/API/Topic/Add =  http://site.com/v1/API/Topic/Add 2012 PHPConf 51
  • 52. API Implementation 2012 PHPConf 52
  • 53. 不用自己造輪子 2012 PHPConf 53
  • 54. Phil Sturgeon’s CodeIgniter REST Server http://github.com/philsturgeon/codeigniter-restserver 2012 PHPConf 54
  • 55. Requirements ● PHP 5.2 or greater ● CodeIgniter 2.1.x to 3.0-dev 2012 PHPConf 55
  • 56. How to install? 2012 PHPConf 56
  • 57. Installation ● Drag and drop the following files into your application's directories – application/libraries/Format.php – application/libraries/REST_Controller.php – application/config/rest.php 2012 PHPConf 57
  • 58. Setup the config ● $config['rest_default_format'] = 'json'; ● $config['rest_enable_keys'] = false; ● $config['rest_enable_logging'] = false; ● $config['rest_enable_limits'] = false; ● $config['rest_ajax_only'] = false; 2012 PHPConf 58
  • 59. Include REST Controller 2012 PHPConf 59
  • 61. Handling Requests class Topic extends REST_Controller { public function index_get() {} public function index_post() {} public function index_update() {} public function index_delete() {} } 2012 PHPConf 61
  • 62. CRUD Requests class Topic extends REST_Controller { public function list_get() {} public function add_post() {} public function update_update() {} public function delete_delete() {} } 2012 PHPConf 62
  • 63. Accessing parameters is also easy 2012 PHPConf 63
  • 64. Parameters ● GET – $this->get('blah'); ● POST – $this->post('blah'); ● UPDATE – $this->update('blah'); ● DELETE – $this->delete('blah'); 2012 PHPConf 64
  • 65. Create API Input Output var object = { { title: 'Kate Upton', id: '1000', text: 'Beautiful girl' success_text: 'ok', }; } http://site.com/API/Topic/Add 2012 PHPConf 65
  • 66. Create API (POST) public function Add_post() { if (!$this->post('title')) { $this->response(array('error' => 'Title is required'), 404); } $output = $this->lib_topic->insert($data); if ($output) { $this->response($output, 200); } else { $this->response(array('error' => 'Insert error'), 404); } } 2012 PHPConf 66
  • 67. Update API Input Output var object = { { id: 1000, id: '1000', title: 'Kate Upton', success_text: 'ok', text: 'Beautiful girl' } }; http://site.com/API/Topic/Update 2012 PHPConf 67
  • 68. Update API (PUT) public function Update_put() { if (!$this->update('id')) { $this->response(array('error' => 'ID is required'), 404); } $output = $this->lib_topic->update($this->update('id'), $data); if ($output) { $this->response($output, 200); } else { $this->response(array('error' => 'Insert error'), 404); } } 2012 PHPConf 68
  • 69. Delete API Input Output var object = { { id: 1000 id: '1000', }; success_text: 'ok', } http://site.com/API/Topic/Delete 2012 PHPConf 69
  • 70. Delete API (DELETE) public function Delete_delete() { if (!$this->delete('id')) { $this->response(array('error' => 'ID is required'), 404); } $output = $this->lib_topic->delete($this->delete('id')); if ($output) { $this->response($output, 200); } else { $this->response(array('error' => 'Insert error'), 404); } } 2012 PHPConf 70
  • 71. Read API (GET) Input Output var object = { { id: 1000, id: '1000', type: [1, 2] success_text: 'ok', }; item: { title: 'Kate Upton' } } http://site.com/API/Topic/List 2012 PHPConf 71
  • 72. Read API (GET) public function List_get() { if (!$this->get('id') or ) { $this->response(array('error' => 'ID is required'), 404); } $output = $this->lib_topic->list($this->get('id'), $this->get('type')); if ($output) { $this->response($output, 200); } else { $this->response(array('error' => 'Insert error'), 404); } } 2012 PHPConf 72
  • 74. Folder application controllers/ api/ topic.php user.php acl.php system index.php 2012 PHPConf 74
  • 75. Routing (config/routes.php) Default URL http://site.com/api/topic/Add $route['API/Topic/(:any)'] = 'api/topic/$1'; $route['API/User/(:any)'] = 'api/user/$1'; $route['API/Acl/(:any)'] = 'api/acl/$1'; New URL http://site.com/API/Topic/Add 2012 PHPConf 75
  • 76. Verify Your API 2012 PHPConf 76
  • 78. Phil Sturgeon’s CodeIgniter REST Client https://github.com/philsturgeon/codeigniter-restclient 2012 PHPConf 78
  • 79. Requirements 2012 PHPConf 79
  • 80. Requirements ● PHP 5.1+ ● CodeIgniter 2.0.0+ ● CURL ● CodeIgniter Curl library: http://getsparks.org/packages/curl/show 2012 PHPConf 80
  • 81. Load Rest Client Library 2012 PHPConf 81
  • 82. Load Library // Load the rest client spark $this->load->spark('restclient/2.1.0'); // Load the library $this->load->library('rest'); 2012 PHPConf 82
  • 83. Setup API Server // Run some setup $this->rest->initial('xxxxxx'); // twitter server $this->load->initial('http://twitter.com'); 2012 PHPConf 83
  • 84. Parameter // set api path $api = '/API/Topic/Add'; // set api data $data = array( 'title' => 'I am Kate Upton', 'type' => 'girl' ); 2012 PHPConf 84
  • 85. Test it // GET API $this->rest->get($api, $data); // POST API $this->rest->post($api, $data); // UPDATE API $this->rest->update($api, $data); // DELETE API $this->rest->delete($api, $data); 2012 PHPConf 85
  • 86. $this->rest->debug(); Rest Client Library debug mode 2012 PHPConf 86
  • 87. 以上是 CodeIgniter PHP Framework 2012 PHPConf 87
  • 88. Implement another Framework? 2012 PHPConf 88
  • 89. Laravel PHP Framework? 2012 PHPConf 89
  • 90. public $restful = true; 2012 PHPConf 90
  • 91. class Home_Controller extends Base_Controller { public $restful = true; public function get_index() { // } public function post_index() { // } 2012 PHPConf 91 }
  • 92. More Introduction to Laravel Framework 14:20 – 14:50 用 Laravel Framework 打造現代化網站應用程式 大澤木小鐵 2012 PHPConf 92
  • 93. RESTful API 就講到這裡 2012 PHPConf 93
  • 94. 如果有任何問題 2012 PHPConf 94
  • 95. 可以上 CodeIgniter 論壇 2012 PHPConf 95
  • 97. 謝謝大家及工作團隊 2012 PHPConf 97