a simple restful webservice for the goblins (v. 0.5)

30

Upload: danilo-sanchi

Post on 06-Jul-2015

378 views

Category:

Self Improvement


0 download

TRANSCRIPT

Page 1: A simple ReSTful webservice for the Goblins (v. 0.5)
Page 2: A simple ReSTful webservice for the Goblins (v. 0.5)
Page 3: A simple ReSTful webservice for the Goblins (v. 0.5)

Cos’è REST?

Page 4: A simple ReSTful webservice for the Goblins (v. 0.5)

REST non è

un Protocolloun’Architetturaun Softwareuno Standardun nome carino per Web Servicesuna Buzzword

Page 5: A simple ReSTful webservice for the Goblins (v. 0.5)

RepresentationalStateTransfer

Roy T. Fielding“Architectural Styles and Design of Network-based Software Architectures”Ph.D dissertation, 2000

Page 6: A simple ReSTful webservice for the Goblins (v. 0.5)

REST è

uno stile architetturale per applicazioni di rete,un insieme di vincoli e principi che, se seguiti, portano come risultato un’architettura semplice

e scalabile

Page 7: A simple ReSTful webservice for the Goblins (v. 0.5)

REST: principi•Stato e funzionalità sono considerati Risorse (recensioni)

•Ogni risorsa è unica e indirizzabile attraverso un URI (/reviews)

•L’accesso alle risorse avviene tramite un’interfaccia uniforme(GET, POST, PUT, DELETE)

•Un protocollo (HTTP)

•Client-server•Stateless•Cacheble•A livelli

Page 8: A simple ReSTful webservice for the Goblins (v. 0.5)

REST: le risorseLe risorse sono fonti di informazioni accessibili attraverso un URI.

Il client può attraverso un protocollo di comunicazione standard (ad es. http) ottenere una risorsa dal server.

Le risorse sono disponibili in diverse rappresentazioni (ad es. XML, JSON, PNG)

Page 9: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTP è RESTfulma REST non è HTTP

Page 10: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTPGET /reviews/?filter=letter&letter=a HTTP/1.1Host: www.goblins.netConnection: Close

HTTP/1.1 200 OKContent-Type: application/xml; charset=UTF-8

<?xml version="1.0" encoding="UTF-8" ?><root> <reviews> <review id=“1" title=“Agricola" > <descrizione>Agricola è un gioco…</descrizione> … </review> <review id=“2" title=“Risiko" > <descrizione>…</descrizione> … </review> </reviews></root>

Page 11: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTPGET /reviews/?filter=letter&letter=a HTTP/1.1Host: www.goblins.netAccept: application/phpConnection: Close

HTTP/1.1 200 OKContent-Type: application/php; charset=UTF-8Connection: Close

a:296:{i:0;a:33:{s:2:"id";s:4:"3791";s:4:"date";s:10:"2008-01-28";s:5:"title";s:18:"A Caccia con Papà";s:8:"reviewer";s…

Page 12: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTPGET /reviews/?filter=letter&letter=a HTTP/1.1Host: www.goblins.netAccept: application/jsonConnection: Close

HTTP/1.1 200 OKContent-Type: application/json; charset=UTF-8Connection: Close

[{"id":"3791","date":"2008-01-28","title":"A Caccia con Pap\u00e0","reviewer": "Lobo","email":"[email protected]","s…

Page 13: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTPGET /reviews/?filter=letter&letter=a HTTP/1.1Host: www.goblins.netAccept: text/ymlConnection: Close

HTTP/1.1 200 OKContent-Type: text/yml; charset=UTF-8Connection: Close

- id: '3791‘ date: '2008-01-28‘ title: 'A Caccia con Papà‘ reviewer: Lobo email: [email protected] score: '0‘ cover: '‘ url: '‘ url_title: '‘ hits: '500‘…

Page 14: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTPGET /reviews/?filter=letter&letter=a HTTP/1.1Host: www.goblins.netAccept: application/phpAccept-Language: itConnection: Close

HTTP/1.1 200 OKContent-Type: application/php; charset=UTF-8Connection: Close

a:296:{i:0;a:33:{s:2:"id";s:4:"3791";s:4:"date";s:10:"2008-01-28";s:5:"title";s:18:"A Caccia con Papà";s:8:"reviewer";s…

Page 15: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTPGET /reviews/?filter=letter&letter=a HTTP/1.1Host: www.goblins.netAccept: application/phpAccept-Encoding: compressConnection: Close

HTTP/1.1 200 OKContent-Type: application/php; charset=UTF-8Content-Encoding: compressVary: Accept-EncodingConnection: Close

#@°&%&%%$&%@°...

Page 16: A simple ReSTful webservice for the Goblins (v. 0.5)

HTTPGET /reviews/?filter=letter&letter=a HTTP/1.1Host: www.goblins.netAccept: application/php; q=0.8, application/json, text/yml; q=0.5Connection: Close

HTTP/1.1 200 OKContent-Type: application/php; charset=UTF-8Connection: Close

a:296:{i:0;a:33:{s:2:"id";s:4:"3791";s:4:"date";s:10:"2008-01-28";s:5:"title";s:18:"A Caccia con Papà";s:8:"reviewer";s…

Page 17: A simple ReSTful webservice for the Goblins (v. 0.5)
Page 18: A simple ReSTful webservice for the Goblins (v. 0.5)
Page 19: A simple ReSTful webservice for the Goblins (v. 0.5)
Page 20: A simple ReSTful webservice for the Goblins (v. 0.5)

MODEL

Page 21: A simple ReSTful webservice for the Goblins (v. 0.5)

MODEL

Record TableCollection <<build>>

BaseReview

Review

ReviewTable

VIEW

Page 22: A simple ReSTful webservice for the Goblins (v. 0.5)

VIEW

Page 23: A simple ReSTful webservice for the Goblins (v. 0.5)

$data = array( 1 => array('ID'=>1, 'title'=>'Agricola', ...), 2 => array('ID'=>2, 'title'=>'Risiko', ...), ...)

//reviews.html<?xml version="1.0" encoding="UTF-8" ?><root> <reviews> {% for i, r in reviews %} <review id="{{r.id}}" title="{{r.title}}" > {% for key, value in r %} <{{key}}>{{value}}</{{key}}> {% endfor %} </review> {% else %} <noresult>No result for this query</noresult> {% endfor %} </reviews></root>

<?xml version="1.0" encoding="UTF-8" ?><root> <reviews> <review id=“1" title=“Agricola" > <descrizione>Agricola è un gioco…</descrizione> … </review> <review id=“2" title=“Risiko" > <descrizione>…</descrizione> … </review> </reviews></root>

Page 24: A simple ReSTful webservice for the Goblins (v. 0.5)

/reviews/?filter=letter&letter=a/reviews/5/reviews/5/comments…

web

.htaccess

dispatch.php

CONTROLLER

Page 25: A simple ReSTful webservice for the Goblins (v. 0.5)

/reviews/?filter=letter&letter=a/reviews/5/reviews/5/comments…

web

.htaccess

dispatch.php

CONTROLLER

Page 26: A simple ReSTful webservice for the Goblins (v. 0.5)

Request

+uri+data+accept+acceptLang+acceptEncoding+method

+loadResource()+ifMatch(etag)+ifNoneMatch(etag)

Resource

+exec(request)+get(request)+post(request)+put(request)+delete(request)+head(request)

NoResource

Response

+code+headers+body

+output()+addHeader()

<<build>>

ReviewsResource

+get(request)

<<build>>

/reviews/?filter=letter&letter=a/reviews/5/reviews/5/comments…

web

.htaccess

dispatch.php

CONTROLLER

//dispatch.php…$request = new Request( $config = array() );$resource = $request->loadResource();$response = $resource->exec($request);$response->output();

Page 27: A simple ReSTful webservice for the Goblins (v. 0.5)

//ReviewResource.php<?php

/** * The Review Collection * @uri /reviews(/\?(.)*)? */class ReviewsResource extends Resource {

/** * Handle a GET request for this resource * @param Request request * @return Response */ function get($request) { $response = new Response($request);

$etag = md5($request->uri); if ($request->ifNoneMatch($etag)) { $response->code = Response::NOTMODIFIED; } else { $response->code = Response::OK; $response->addHeader('Content-type', 'text/html; charset="UTF-8"'); $headers = $this->selectHeaders($request); foreach($headers as $key => $value) $response->addHeader($key, $value); $response->addEtag($etag); $response->body = $this->selectBody($request); } return $response; } …}

Page 28: A simple ReSTful webservice for the Goblins (v. 0.5)

On code

Page 29: A simple ReSTful webservice for the Goblins (v. 0.5)

/reviews/5

Page 30: A simple ReSTful webservice for the Goblins (v. 0.5)

web