RESTful API Design & Implementation with CodeIgniter PHP Framework

54,160 views

Published on

7 Comments
83 Likes
Statistics
Notes
No Downloads
Views
Total views
54,160
On SlideShare
0
From Embeds
0
Number of Embeds
6,124
Actions
Shares
0
Downloads
1,790
Comments
7
Likes
83
Embeds 0
No embeds

No notes for slide

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

×