A simple ReSTful webservice for the Goblins (v. 0.5)
-
Upload
danilo-sanchi -
Category
Self Improvement
-
view
376 -
download
0
Transcript of A simple ReSTful webservice for the Goblins (v. 0.5)
Cos’è REST?
REST non è
un Protocolloun’Architetturaun Softwareuno Standardun nome carino per Web Servicesuna Buzzword
RepresentationalStateTransfer
Roy T. Fielding“Architectural Styles and Design of Network-based Software Architectures”Ph.D dissertation, 2000
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
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
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)
HTTP è RESTfulma REST non è HTTP
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>
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…
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…
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‘…
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…
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
#@°&%&%%$&%@°...
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…
MODEL
MODEL
Record TableCollection <<build>>
BaseReview
Review
ReviewTable
VIEW
VIEW
$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>
/reviews/?filter=letter&letter=a/reviews/5/reviews/5/comments…
web
.htaccess
dispatch.php
CONTROLLER
/reviews/?filter=letter&letter=a/reviews/5/reviews/5/comments…
web
.htaccess
dispatch.php
CONTROLLER
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();
//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; } …}
On code
/reviews/5
web