Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,...
Who Am I●   Open Source Contributions (github: appleboy)    –   CodeIgniter-Native-Session    –   CodeIgniter-i18n    –   ...
My Focus●   CodeIgbiter 3.0.x develop branch    –   Support Native Session    –   Support HMVC    –   Support Sparks Packa...
Outline● Restful API Basic● API Design● Implementing API with CodeIgniter● Verify your API                2012 PHPConf    ...
Restful API Basic       2012 PHPConf   6
Why Use Restful?          Restful API Service                Database                2012 PHPConf             (MySQL,Mongo...
What is REST? Http Method●   POST●   GET●   PUT●   DELETE●   OPTIONS              Define in RFC 2616                    20...
並非所有的瀏覽器都支援    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  ...
JSON in Javascript is familiar        var object = {          key1: value1,          key2: 20121103          key3: [1,2,3]...
JSON in PHP (encode)         PHP                             Outputs<?phpecho json_encode(array(                  {key: va...
JSON in PHP (decode)               PHP                         Outputs<?php$json_data = {key: value};            array(   ...
你不可不知的 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           ...
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  ...
Format 2: Topic Module● /API/Topic/Add● /API/Topic/Update/1234● /API/Topic/Delete/1234● /API/Topic/List/sort/asc          ...
個人偏好格式 1   2012 PHPConf   32
不用記住多種不同 API 格式      2012 PHPConf   33
API Response Format        2012 PHPConf   34
請勿常常修改 format     ( 除非你想黑掉 )       2012 PHPConf   35
Example Create API          Input                          Outputvar object = {               {   title: value1,          ...
Example Create API           Input                         Outputvar object = {               {   title: value1,          ...
Example Update API           Input                         Outputvar object = {               {   id: 1000,               ...
Example Update API           Input                         Outputvar object = {               {   title: value1,          ...
Example Delete API (single)         Input                          Outputvar object = {              {   id: 1000         ...
Example Delete API (multiple)         Input                           Outputvar object = {               {   id: [1000, 10...
Example Delete API          Input                         Outputvar object = {              {                             ...
Example Read API (Single)         Input                            Outputvar object = {               {   id: 1000        ...
Example Search API (Multiple)         Input              {            Outputvar object = {                      id: 1000, ...
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/AddNew: 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 Serverhttp://github.com/philsturgeon/codeigniter-restserver                       ...
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    applications directories    –   application/libraries/Forma...
Setup the config●   $config[rest_default_format] = json;●   $config[rest_enable_keys] = false;●   $config[rest_enable_logg...
Include REST Controller          2012 PHPConf   59
require(APPPATH./libraries/REST_Controller.php);                      2012 PHPConf            60
Handling Requestsclass Topic extends REST_Controller{  public function index_get() {}  public function index_post() {}  pu...
CRUD Requestsclass Topic extends REST_Controller{  public function list_get() {}  public function add_post() {}  public fu...
Accessing parameters is also easy              2012 PHPConf     63
Parameters● GET  – $this->get(blah);● POST  – $this->post(blah);● UPDATE  – $this->update(blah);● DELETE  – $this->delete(...
Create API           Input                               Outputvar object = {                     {   title: Kate Upton,  ...
Create API (POST)public function Add_post(){  if (!$this->post(title)) {      $this->response(array(error => Title is requ...
Update API           Input                               Outputvar object = {                     {   id: 1000,           ...
Update API (PUT)public function Update_put(){  if (!$this->update(id)) {      $this->response(array(error => ID is require...
Delete API         Input                          Outputvar object = {              {   id: 1000                         i...
Delete API (DELETE)public function Delete_delete(){  if (!$this->delete(id)) {      $this->response(array(error => ID is r...
Read API (GET)          Input                            Outputvar object = {                {   id: 1000,                ...
Read API (GET)public function List_get(){  if (!$this->get(id) or ) {      $this->response(array(error => ID is required),...
目錄結構 2012 PHPConf   73
Folder application    controllers/      api/       topic.php       user.php       acl.php system index.php                ...
Routing (config/routes.php) Default URL http://site.com/api/topic/Add  $route[API/Topic/(:any)] = api/topic/$1;  $route[AP...
Verify Your API      2012 PHPConf   76
一樣不需要自己造輪子    2012 PHPConf   77
Phil Sturgeon’s         CodeIgniter REST Clienthttps://github.com/philsturgeon/codeigniter-restclient                     ...
Requirements     2012 PHPConf   79
Requirements●   PHP 5.1+●   CodeIgniter 2.0.0+●   CURL●   CodeIgniter Curl library:    http://getsparks.org/packages/curl/...
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...
Setup API Server// Run some setup$this->rest->initial(xxxxxx);// twitter server$this->load->initial(http://twitter.com);  ...
Parameter// set api path$api = /API/Topic/Add;// set api data$data = array(   title => I am Kate Upton,   type => girl);  ...
Test it// GET API$this->rest->get($api, $data);// POST API$this->rest->post($api, $data);// UPDATE API$this->rest->update(...
$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()    {      //    } ...
More Introduction to Laravel Framework               14:20 – 14:50用 Laravel Framework 打造現代化網站應用程式                大澤木小鐵    ...
RESTful API 就講到這裡       2012 PHPConf   93
如果有任何問題   2012 PHPConf   94
可以上 CodeIgniter 論壇        2012 PHPConf   95
http://www.codeigniter.org.tw/forum/               2012 PHPConf       96
謝謝大家及工作團隊    2012 PHPConf   97
Upcoming SlideShare
Loading in …5
×

RESTful API Design & Implementation with CodeIgniter PHP Framework

64,786 views

Published on

  • Get HERE to Read This eBook === http://pdfasgoasasga.qpoe.com/B00L6L4B3Y-presentation-du-mkframework-un-framework-php-simpe-decouvrez-une-maniere-simple-et-rapide-de-faire-des-sites-web.html
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ❤❤❤ http://bit.ly/2u6xbL5 ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ♥♥♥ http://bit.ly/2u6xbL5 ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ❶❶❶ http://bit.ly/2LaDVgK ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ♥♥♥ http://bit.ly/2LaDVgK ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

RESTful API Design & Implementation with CodeIgniter PHP Framework

  1. 1. RESTful API Design & Implementation with CodeIgniter PHP Framework 2012 PHP Conference
  2. 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. 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. 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. 5. Outline● Restful API Basic● API Design● Implementing API with CodeIgniter● Verify your API 2012 PHPConf 5
  6. 6. Restful API Basic 2012 PHPConf 6
  7. 7. Why Use Restful? Restful API Service Database 2012 PHPConf (MySQL,MongoDB) 7
  8. 8. What is REST? Http Method● POST● GET● PUT● DELETE● OPTIONS Define in RFC 2616 2012 PHPConf 8
  9. 9. 並非所有的瀏覽器都支援 PUT, DELETE http://api.jquery.com/jQuery.ajax/ 2012 PHPConf 9
  10. 10. 如何解決未支援的瀏覽器 2012 PHPConf 10
  11. 11. <input type=hidden name=type value=PUT> 2012 PHPConf 11
  12. 12. 將 PUT,DELETE 一併寫成 POST API 2012 PHPConf 12
  13. 13. REST Response Format?● JSON*● XML● Array● Html● CSV 2012 PHPConf 13
  14. 14. 現在皆以 JSON 為主 格式簡單 , 相容性高 , 閱讀方便 2012 PHPConf 14
  15. 15. Javascript Object Notation { key1: value1, key2: 20121103 key3: [1,2,3] } 2012 PHPConf 15
  16. 16. JSON in Javascript is familiar var object = { key1: value1, key2: 20121103 key3: [1,2,3] } 2012 PHPConf 16
  17. 17. JSON in PHP (encode) PHP Outputs<?phpecho json_encode(array( {key: value} key => value)); 2012 PHPConf 17
  18. 18. JSON in PHP (decode) PHP Outputs<?php$json_data = {key: value}; array( key => valueecho json_decode({ ); key => value}); 2012 PHPConf 18
  19. 19. 你不可不知的 JSON 基本介紹 http://goo.gl/Wvhwb 2012 PHPConf 19
  20. 20. API Design 2012 PHPConf 20
  21. 21. 良好的 API 設計● Simple 簡單● Intuitive 直觀的● Stable 穩定● Well Document 線上文件 2012 PHPConf 21
  22. 22. Using Facebook API 2012 PHPConf 22
  23. 23. Fucking Stable and Document 2012 PHPConf 23
  24. 24. 請務必撰寫 API 線上文件 2012 PHPConf 24
  25. 25. 大家每天在花在討論的時間太長 Debug 時間變少 2012 PHPConf 25
  26. 26. 良好的文件減少人與人溝通成本 團隊合作 2012 PHPConf 26
  27. 27. Http Method RFC 2616 CRUD Method● Create ● POST● Read ● GET● Update ● PUT● Delete ● DELETE 2012 PHPConf 27
  28. 28. API URL Define 2012 PHPConf 28
  29. 29. /API/Module/Method 2012 PHPConf 29
  30. 30. Format 1: Topic Module● /API/Topic/Add● /API/Topic/Update● /API/Topic/Delete● /API/Topic/List 2012 PHPConf 30
  31. 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. 32. 個人偏好格式 1 2012 PHPConf 32
  33. 33. 不用記住多種不同 API 格式 2012 PHPConf 33
  34. 34. API Response Format 2012 PHPConf 34
  35. 35. 請勿常常修改 format ( 除非你想黑掉 ) 2012 PHPConf 35
  36. 36. Example Create API Input Outputvar 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. 37. Example Create API Input Outputvar 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. 38. Example Update API Input Outputvar 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. 39. Example Update API Input Outputvar 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. 40. Example Delete API (single) Input Outputvar object = { { id: 1000 id: 1000,}; success_text: ok } http://site.com/API/Topic/Delete 2012 PHPConf 40
  41. 41. Example Delete API (multiple) Input Outputvar object = { { id: [1000, 1001] id: 1000,}; success_text: ok } http://site.com/API/Topic/Delete 2012 PHPConf 41
  42. 42. Example Delete API Input Outputvar object = { { id: 1000,}; success_text: ok } http://site.com/API/Topic/Delete/1000 2012 PHPConf 42
  43. 43. Example Read API (Single) Input Outputvar object = { { id: 1000 id: 1000,}; success_text: ok, item: { title: Kate Upton } } http://site.com/API/Topic/List 2012 PHPConf 43
  44. 44. Example Search API (Multiple) Input { Outputvar 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. 45. Kate Upton 2012 PHPConf 45
  46. 46. 多虧了 Youtube API 讓我在上班時增加了很多動力 2012 PHPConf 46
  47. 47. How to handle versioning? 2012 PHPConf 47
  48. 48. 內部 API 大改版 2012 PHPConf 48
  49. 49. Old: http://site.com/v1/API/Topic/AddNew: http://site.com/v2/API/Topic/Add 2012 PHPConf 49
  50. 50. 利用 URI Routing 功能Framework or mod_rewrite 2012 PHPConf 50
  51. 51. http://site.com/API/Topic/Add = http://site.com/v1/API/Topic/Add 2012 PHPConf 51
  52. 52. API Implementation 2012 PHPConf 52
  53. 53. 不用自己造輪子 2012 PHPConf 53
  54. 54. Phil Sturgeon’s CodeIgniter REST Serverhttp://github.com/philsturgeon/codeigniter-restserver 2012 PHPConf 54
  55. 55. Requirements● PHP 5.2 or greater● CodeIgniter 2.1.x to 3.0-dev 2012 PHPConf 55
  56. 56. How to install? 2012 PHPConf 56
  57. 57. Installation● Drag and drop the following files into your applications directories – application/libraries/Format.php – application/libraries/REST_Controller.php – application/config/rest.php 2012 PHPConf 57
  58. 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. 59. Include REST Controller 2012 PHPConf 59
  60. 60. require(APPPATH./libraries/REST_Controller.php); 2012 PHPConf 60
  61. 61. Handling Requestsclass Topic extends REST_Controller{ public function index_get() {} public function index_post() {} public function index_update() {} public function index_delete() {}} 2012 PHPConf 61
  62. 62. CRUD Requestsclass Topic extends REST_Controller{ public function list_get() {} public function add_post() {} public function update_update() {} public function delete_delete() {}} 2012 PHPConf 62
  63. 63. Accessing parameters is also easy 2012 PHPConf 63
  64. 64. Parameters● GET – $this->get(blah);● POST – $this->post(blah);● UPDATE – $this->update(blah);● DELETE – $this->delete(blah); 2012 PHPConf 64
  65. 65. Create API Input Outputvar object = { { title: Kate Upton, id: 1000, text: Beautiful girl success_text: ok,}; } http://site.com/API/Topic/Add 2012 PHPConf 65
  66. 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. 67. Update API Input Outputvar object = { { id: 1000, id: 1000, title: Kate Upton, success_text: ok, text: Beautiful girl }}; http://site.com/API/Topic/Update 2012 PHPConf 67
  68. 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. 69. Delete API Input Outputvar object = { { id: 1000 id: 1000,}; success_text: ok, } http://site.com/API/Topic/Delete 2012 PHPConf 69
  70. 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. 71. Read API (GET) Input Outputvar 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. 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
  73. 73. 目錄結構 2012 PHPConf 73
  74. 74. Folder application controllers/ api/ topic.php user.php acl.php system index.php 2012 PHPConf 74
  75. 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. 76. Verify Your API 2012 PHPConf 76
  77. 77. 一樣不需要自己造輪子 2012 PHPConf 77
  78. 78. Phil Sturgeon’s CodeIgniter REST Clienthttps://github.com/philsturgeon/codeigniter-restclient 2012 PHPConf 78
  79. 79. Requirements 2012 PHPConf 79
  80. 80. Requirements● PHP 5.1+● CodeIgniter 2.0.0+● CURL● CodeIgniter Curl library: http://getsparks.org/packages/curl/show 2012 PHPConf 80
  81. 81. Load Rest Client Library 2012 PHPConf 81
  82. 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. 83. Setup API Server// Run some setup$this->rest->initial(xxxxxx);// twitter server$this->load->initial(http://twitter.com); 2012 PHPConf 83
  84. 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. 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. 86. $this->rest->debug(); Rest Client Library debug mode 2012 PHPConf 86
  87. 87. 以上是 CodeIgniter PHP Framework 2012 PHPConf 87
  88. 88. Implement another Framework? 2012 PHPConf 88
  89. 89. Laravel PHP Framework? 2012 PHPConf 89
  90. 90. public $restful = true; 2012 PHPConf 90
  91. 91. class Home_Controller extends Base_Controller{ public $restful = true; public function get_index() { // } public function post_index() { // } 2012 PHPConf 91}
  92. 92. More Introduction to Laravel Framework 14:20 – 14:50用 Laravel Framework 打造現代化網站應用程式 大澤木小鐵 2012 PHPConf 92
  93. 93. RESTful API 就講到這裡 2012 PHPConf 93
  94. 94. 如果有任何問題 2012 PHPConf 94
  95. 95. 可以上 CodeIgniter 論壇 2012 PHPConf 95
  96. 96. http://www.codeigniter.org.tw/forum/ 2012 PHPConf 96
  97. 97. 謝謝大家及工作團隊 2012 PHPConf 97

×