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

Api details for american syscorp

Embed Size (px)

Citation preview

Page 1: Api details for american syscorp

RESTful API Design & Implementation with CodeIgniter PHP Framework

2012 PHP Conference

Page 2: Api details for american syscorp

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 ...

Page 3: Api details for american syscorp

2012 PHPConf 3

Who Am I

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

– CodeIgniter-i18n

– CodeIgniter-Template

– CodeIgniter-Nexmo-Message

– CodeIgniter-TextMagic-API

Page 4: Api details for american syscorp

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)

Page 5: Api details for american syscorp

2012 PHPConf 5

Outline

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

Page 6: Api details for american syscorp

2012 PHPConf 6

Restful API BasicRestful API Basic

Page 7: Api details for american syscorp

2012 PHPConf 7

Why Use Restful?

Restful API Service

Database(MySQL,MongoDB)

Page 8: Api details for american syscorp

2012 PHPConf 8

What is REST? Http Method

● POST● GET● PUT● DELETE● OPTIONS

Define in RFC 2616

Page 9: Api details for american syscorp

2012 PHPConf 9

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

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

Page 10: Api details for american syscorp

2012 PHPConf 10

如何解決未支援的瀏覽器

Page 11: Api details for american syscorp

2012 PHPConf 11

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

Page 12: Api details for american syscorp

2012 PHPConf 12

將PUT,DELETE一併寫成POST API

Page 13: Api details for american syscorp

2012 PHPConf 13

REST Response Format?

● JSON*● XML● Array● Html● CSV

Page 14: Api details for american syscorp

2012 PHPConf 14

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

Page 15: Api details for american syscorp

2012 PHPConf 15

Javascript Object Notation

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

}

Page 16: Api details for american syscorp

2012 PHPConf 16

JSON in Javascript is familiar

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

Page 17: Api details for american syscorp

2012 PHPConf 17

JSON in PHP (encode)

PHP<?php

echo json_encode(array(

'key' => 'value'

));

Outputs{key: 'value'}

Page 18: Api details for american syscorp

2012 PHPConf 18

JSON in PHP (decode)

PHP<?php

$json_data = '{key: value}';

echo json_decode({

'key' => 'value'

});

Outputsarray(

'key' => 'value');

Page 19: Api details for american syscorp

2012 PHPConf 19

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

Page 20: Api details for american syscorp

2012 PHPConf 20

API DesignAPI Design

Page 21: Api details for american syscorp

2012 PHPConf 21

良好的 API設計

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

Page 22: Api details for american syscorp

2012 PHPConf 22

Using Facebook APIUsing Facebook API

Page 23: Api details for american syscorp

2012 PHPConf 23

Fucking Stable and DocumentFucking Stable and Document

Page 24: Api details for american syscorp

2012 PHPConf 24

請務必撰寫APIAPI線上文件

Page 25: Api details for american syscorp

2012 PHPConf 25

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

Page 26: Api details for american syscorp

2012 PHPConf 26

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

Page 27: Api details for american syscorp

2012 PHPConf 27

Http Method RFC 2616

● Create● Read● Update● Delete

● POST● GET● PUT● DELETE

CRUD Method

Page 28: Api details for american syscorp

2012 PHPConf 28

API URL DefineAPI URL Define

Page 29: Api details for american syscorp

2012 PHPConf 29

/API//API/ModuleModule//MethodMethod

Page 30: Api details for american syscorp

2012 PHPConf 30

Format 1: Topic Module

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

Page 31: Api details for american syscorp

2012 PHPConf 31

Format 2: Topic Module

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

Page 32: Api details for american syscorp

2012 PHPConf 32

個人偏好格式 1

Page 33: Api details for american syscorp

2012 PHPConf 33

不用記住多種不同APIAPI格式

Page 34: Api details for american syscorp

2012 PHPConf 34

API Response FormatAPI Response Format

Page 35: Api details for american syscorp

2012 PHPConf 35

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

Page 36: Api details for american syscorp

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

Page 37: Api details for american syscorp

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

Page 38: Api details for american syscorp

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

Page 39: Api details for american syscorp

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

Page 40: Api details for american syscorp

2012 PHPConf 40

Example Delete API (single)

var object = {id: 1000

};

Input Output{

id: '1000',success_text: 'ok'

}

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

Page 41: Api details for american syscorp

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

Page 42: Api details for american syscorp

2012 PHPConf 42

Example Delete API

var object = {

};

Input Output{

id: '1000',success_text: 'ok'

}

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

Page 43: Api details for american syscorp

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

Page 44: Api details for american syscorp

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

Page 45: Api details for american syscorp

2012 PHPConf 45

Kate Upton

Page 46: Api details for american syscorp

2012 PHPConf 46

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

Page 47: Api details for american syscorp

2012 PHPConf 47

How to handle versioning?How to handle versioning?

Page 48: Api details for american syscorp

2012 PHPConf 48

內部 APIAPI 大改版

Page 49: Api details for american syscorp

2012 PHPConf 49

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

Page 50: Api details for american syscorp

2012 PHPConf 50

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

Page 51: Api details for american syscorp

2012 PHPConf 51

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

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

Page 52: Api details for american syscorp

2012 PHPConf 52

API ImplementationAPI Implementation

Page 53: Api details for american syscorp

2012 PHPConf 53

不用自己造輪子

Page 54: Api details for american syscorp

2012 PHPConf 54

Phil Sturgeon’sCodeIgniter REST Server

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

Page 55: Api details for american syscorp

2012 PHPConf 55

Requirements

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

Page 56: Api details for american syscorp

2012 PHPConf 56

How to install?How to install?

Page 57: Api details for american syscorp

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

Page 58: Api details for american syscorp

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;

Page 59: Api details for american syscorp

2012 PHPConf 59

Include REST ControllerInclude REST Controller

Page 60: Api details for american syscorp

2012 PHPConf 60

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

Page 61: Api details for american syscorp

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() {}

}

Page 62: Api details for american syscorp

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() {}

}

Page 63: Api details for american syscorp

2012 PHPConf 63

Accessing parameters is also easyAccessing parameters is also easy

Page 64: Api details for american syscorp

2012 PHPConf 64

Parameters

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

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

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

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

Page 65: Api details for american syscorp

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

Page 66: Api details for american syscorp

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); } }

Page 67: Api details for american syscorp

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

Page 68: Api details for american syscorp

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); } }

Page 69: Api details for american syscorp

2012 PHPConf 69

Delete API

var object = {id: 1000

};

Input Output{

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

}

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

Page 70: Api details for american syscorp

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); } }

Page 71: Api details for american syscorp

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

Page 72: Api details for american syscorp

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); } }

Page 73: Api details for american syscorp

2012 PHPConf 73

目錄結構

Page 74: Api details for american syscorp

2012 PHPConf 74

Folder

application controllers/

api/topic.phpuser.phpacl.php

system index.php

Page 75: Api details for american syscorp

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

Page 76: Api details for american syscorp

2012 PHPConf 76

Verify Your APIVerify Your API

Page 77: Api details for american syscorp

2012 PHPConf 77

一樣不需要自己造輪子

Page 78: Api details for american syscorp

2012 PHPConf 78

Phil Sturgeon’sCodeIgniter REST Client

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

Page 79: Api details for american syscorp

2012 PHPConf 79

RequirementsRequirements

Page 80: Api details for american syscorp

2012 PHPConf 80

Requirements

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

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

Page 81: Api details for american syscorp

2012 PHPConf 81

Load Rest Client LibraryLoad Rest Client Library

Page 82: Api details for american syscorp

2012 PHPConf 82

Load Library

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

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

Page 83: Api details for american syscorp

2012 PHPConf 83

Setup API Server

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

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

Page 84: Api details for american syscorp

2012 PHPConf 84

Parameter

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

// set api data$data = array(

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

);

Page 85: Api details for american syscorp

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);

Page 86: Api details for american syscorp

2012 PHPConf 86

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

Page 87: Api details for american syscorp

2012 PHPConf 87

以上是CodeIgniter PHP Framework

Page 88: Api details for american syscorp

2012 PHPConf 88

Implement another Framework?Implement another Framework?

Page 89: Api details for american syscorp

2012 PHPConf 89

Laravel PHP Framework?Laravel PHP Framework?

Page 90: Api details for american syscorp

2012 PHPConf 90

public $restful = true;

Page 91: Api details for american syscorp

2012 PHPConf 91

class Home_Controller extends Base_Controller{ public $restful = true;

public function get_index() { // }

public function post_index() { // }

}

Page 92: Api details for american syscorp

2012 PHPConf 92

More Introduction to Laravel Framework14:20 – 14:50

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

Page 93: Api details for american syscorp

2012 PHPConf 93

RESTful API就講到這裡

Page 94: Api details for american syscorp

2012 PHPConf 94

如果有任何問題

Page 95: Api details for american syscorp

2012 PHPConf 95

可以上CodeIgniterCodeIgniter論壇

Page 96: Api details for american syscorp

2012 PHPConf 96

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

Page 97: Api details for american syscorp

2012 PHPConf 97

謝謝大家及工作團隊