97
RESTful API Design & Implementation with CodeIgniter PHP Framework 2012 PHP Conference

RESTful API Design & Implementation with CodeIgniter PHP Framework

  • Upload
    bo-yi-wu

  • View
    34.693

  • Download
    2

Embed Size (px)

Citation preview

RESTful API Design & Implementation with CodeIgniter PHP Framework

2012 PHP Conference

2012 PHPConf 2

Who Am I

Bo-Yi Wu@appleboyhttp://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 3

Who Am I

● Open Source Contributions (github: appleboy)– CodeIgniter-Native-Session

– CodeIgniter-i18n

– CodeIgniter-Template

– CodeIgniter-Nexmo-Message

– CodeIgniter-TextMagic-API

2012 PHPConf 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 5

Outline

● Restful API Basic● API Design● Implementing API with CodeIgniter● Verify your API

2012 PHPConf 6

Restful API BasicRestful API Basic

2012 PHPConf 7

Why Use Restful?

Restful API Service

Database(MySQL,MongoDB)

2012 PHPConf 8

What is REST? Http Method

● POST● GET● PUT● DELETE● OPTIONS

Define in RFC 2616

2012 PHPConf 9

並非所有的瀏覽器都支援PUT, DELETE

http://api.jquery.com/jQuery.ajax/

2012 PHPConf 10

如何解決未支援的瀏覽器

2012 PHPConf 11

<input type='hidden' name='type' value='PUT'>

2012 PHPConf 12

將PUT,DELETE一併寫成POST API

2012 PHPConf 13

REST Response Format?

● JSON*● XML● Array● Html● CSV

2012 PHPConf 14

現在皆以 JSONJSON為主格式簡單 ,相容性高 ,閱讀方便

2012 PHPConf 15

Javascript Object Notation

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

}

2012 PHPConf 16

JSON in Javascript is familiar

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

2012 PHPConf 17

JSON in PHP (encode)

PHP<?php

echo json_encode(array(

'key' => 'value'

));

Outputs{key: 'value'}

2012 PHPConf 18

JSON in PHP (decode)

PHP<?php

$json_data = '{key: value}';

echo json_decode({

'key' => 'value'

});

Outputsarray(

'key' => 'value');

2012 PHPConf 19

你不可不知的 JSONJSON基本介紹http://goo.gl/Wvhwb

2012 PHPConf 20

API DesignAPI Design

2012 PHPConf 21

良好的 API設計

● Simple簡單● Intuitive直觀的● Stable穩定● Well Document線上文件

2012 PHPConf 22

Using Facebook APIUsing Facebook API

2012 PHPConf 23

Fucking Stable and DocumentFucking Stable and Document

2012 PHPConf 24

請務必撰寫APIAPI線上文件

2012 PHPConf 25

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

2012 PHPConf 26

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

2012 PHPConf 27

Http Method RFC 2616

● Create● Read● Update● Delete

● POST● GET● PUT● DELETE

CRUD Method

2012 PHPConf 28

API URL DefineAPI URL Define

2012 PHPConf 29

/API//API/ModuleModule//MethodMethod

2012 PHPConf 30

Format 1: Topic Module

● /API/Topic/Add● /API/Topic/Update● /API/Topic/Delete● /API/Topic/List

2012 PHPConf 31

Format 2: Topic Module

● /API/Topic/Add● /API/Topic/Update/1234● /API/Topic/Delete/1234● /API/Topic/List/sort/asc

2012 PHPConf 32

個人偏好格式 1

2012 PHPConf 33

不用記住多種不同APIAPI格式

2012 PHPConf 34

API Response FormatAPI Response Format

2012 PHPConf 35

請勿常常修改 formatformat(除非你想黑掉 )

2012 PHPConf 36

Example Create API

var object = {title: 'value1',type: 'value2',user_id: '1000'

};

Input Output{

title: 'value1',type: 'value2',user_id: '1000',success_text: 'ok'

}

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

2012 PHPConf 37

Example Create API

var object = {title: 'value1',type: 'value2'

};

Input Output{

title: 'value1',type: 'value2',user_id: '1000',success_text: 'ok'

}

http://site.com/API/Topic/Add/1000

2012 PHPConf 38

Example Update API

var object = {id: '1000',title: 'value1',type: 'value2'

};

Input Output{

id: '1000',title: 'value1',type: 'value2',success_text: 'ok'

}

http://site.com/API/Topic/Update

2012 PHPConf 39

Example Update API

var object = {title: 'value1',type: 'value2'

};

Input Output{

id: '1000',title: 'value1',type: 'value2',success_text: 'ok'

}

http://site.com/API/Topic/Update/1000

2012 PHPConf 40

Example Delete API (single)

var object = {id: 1000

};

Input Output{

id: '1000',success_text: 'ok'

}

http://site.com/API/Topic/Delete

2012 PHPConf 41

Example Delete API (multiple)

var object = {id: [1000, 1001]

};

Input Output{

id: '1000',success_text: 'ok'

}

http://site.com/API/Topic/Delete

2012 PHPConf 42

Example Delete API

var object = {

};

Input Output{

id: '1000',success_text: 'ok'

}

http://site.com/API/Topic/Delete/1000

2012 PHPConf 43

Example Read API (Single)

var object = {id: 1000

};

Input Output{

id: '1000',success_text: 'ok',item: {

title: 'Kate Upton'}

}

http://site.com/API/Topic/List

2012 PHPConf 44

Example Search API (Multiple)

var object = {q: 'Kate Upton'

};

Input Output{id: '1000',success_text: 'ok',items: [

{title: 'I am kate'},{title: 'I am Upton'}

]}

http://site.com/API/Topic/List

2012 PHPConf 45

Kate Upton

2012 PHPConf 46

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

2012 PHPConf 47

How to handle versioning?How to handle versioning?

2012 PHPConf 48

內部 APIAPI 大改版

2012 PHPConf 49

Old: http://site.com/v1/API/Topic/AddNew: http://site.com/v2/API/Topic/Add

2012 PHPConf 50

利用URI RoutingURI Routing功能Framework or mod_rewriteFramework or mod_rewrite

2012 PHPConf 51

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

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

2012 PHPConf 52

API ImplementationAPI Implementation

2012 PHPConf 53

不用自己造輪子

2012 PHPConf 54

Phil Sturgeon’sCodeIgniter REST Server

http://github.com/philsturgeon/codeigniter-restserver

2012 PHPConf 55

Requirements

● PHP 5.2 or greater● CodeIgniter 2.1.x to 3.0-dev

2012 PHPConf 56

How to install?How to install?

2012 PHPConf 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 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 59

Include REST ControllerInclude REST Controller

2012 PHPConf 60

require(APPPATH.'/libraries/REST_Controller.php');

2012 PHPConf 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 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 63

Accessing parameters is also easyAccessing parameters is also easy

2012 PHPConf 64

Parameters

● GET– $this->get('blah');

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

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

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

2012 PHPConf 65

Create API

var object = {title: 'Kate Upton',text: 'Beautiful girl'

};

Input Output{

id: '1000',success_text: 'ok',

}

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

2012 PHPConf 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 67

Update API

var object = {id: 1000,title: 'Kate Upton',text: 'Beautiful girl'

};

Input Output{

id: '1000',success_text: 'ok',

}

http://site.com/API/Topic/Update

2012 PHPConf 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 69

Delete API

var object = {id: 1000

};

Input Output{

id: '1000',success_text: 'ok',

}

http://site.com/API/Topic/Delete

2012 PHPConf 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 71

Read API (GET)

var object = {id: 1000,type: [1, 2]

};

Input Output{

id: '1000',success_text: 'ok',item: {

title: 'Kate Upton'}

}

http://site.com/API/Topic/List

2012 PHPConf 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 73

目錄結構

2012 PHPConf 74

Folder

application controllers/

api/topic.phpuser.phpacl.php

system index.php

2012 PHPConf 75

Routing (config/routes.php)

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

New 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';

2012 PHPConf 76

Verify Your APIVerify Your API

2012 PHPConf 77

一樣不需要自己造輪子

2012 PHPConf 78

Phil Sturgeon’sCodeIgniter REST Client

https://github.com/philsturgeon/codeigniter-restclient

2012 PHPConf 79

RequirementsRequirements

2012 PHPConf 80

Requirements

● PHP 5.1+● CodeIgniter 2.0.0+● CURL● CodeIgniter Curl library:

http://getsparks.org/packages/curl/show

2012 PHPConf 81

Load Rest Client LibraryLoad Rest Client Library

2012 PHPConf 82

Load Library

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

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

2012 PHPConf 83

Setup API Server

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

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

2012 PHPConf 84

Parameter

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

// set api data$data = array(

'title' => 'I am Kate Upton','type' => 'girl'

);

2012 PHPConf 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 86

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

2012 PHPConf 87

以上是CodeIgniter PHP Framework

2012 PHPConf 88

Implement another Framework?Implement another Framework?

2012 PHPConf 89

Laravel PHP Framework?Laravel PHP Framework?

2012 PHPConf 90

public $restful = true;

2012 PHPConf 91

class Home_Controller extends Base_Controller{ public $restful = true;

public function get_index() { // }

public function post_index() { // }

}

2012 PHPConf 92

More Introduction to Laravel Framework14:20 – 14:50

用 Laravel Framework打造現代化網站應用程式大澤木小鐵

2012 PHPConf 93

RESTful API就講到這裡

2012 PHPConf 94

如果有任何問題

2012 PHPConf 95

可以上CodeIgniterCodeIgniter論壇

2012 PHPConf 96

http://www.codeigniter.org.tw/forum/

2012 PHPConf 97

謝謝大家及工作團隊