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

Post on 06-Jul-2015

376 views 0 download

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":"sdp@sdp.net","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: sdp@sdhjp.net 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