SlideShare uma empresa Scribd logo
1 de 60
Baixar para ler offline
Resource-Oriented
  Web Services
 Applying the REST Architectural Style
This presentation will discuss how the Representational State
Transfer (REST) architectural style can be applied to the design
of your web services.

You will learn how to use HTTP methods and status codes
properly and we will discuss how to use Hypermedia As The
Engine Of Application State (HATEOAS).

The principles of REST and HATEOAS will be demonstrated
through the Atom Publishing Protocol (AtomPub) using the
Google Data APIs and other AtomPub implementations as
examples.
HTTP
"Hypertext Transfer Protocol (HTTP) is an
application-level protocol for distributed,
collaborative, hypermedia information systems. Its
use for retrieving inter-linked resources led to the
establishment of the World Wide Web."[1]
Methods and Resources
HTTP methods are the actions
that can be performed on resources.
Uniform Resource Identi ers (URIs)
Resources are identi ed by a URI.
URIs
Example URIs:
http://www.example.org/people
http://www.example.org/people/bradley-holt


Examples of resources could include:
  • documents
  • people
  • places
  • things
  • abstract concepts (e.g. processes, transactions)
Limited Vocabulary
There are only 8 methods: HEAD, GET, POST, PUT,
DELETE, TRACE, OPTIONS, CONNECT (we're only
going to talk about 4 of them); but you get to de ne
your own resources.[2]
REST Architecture
  • HTTP is just one (very popular) instance of the REST
      architecture.
  •   You can use HTTP correctly and not be RESTful and you
      can use REST without HTTP.
  •   REST is about de ning a uniform interface.

Example of a non-RESTful standard based on HTTP:
  • WebDAV
What Makes a Service RESTful?
If the HTTP method doesn’t match the method
information, the service isn’t RESTful. If the scoping
information isn’t in the URI, the service isn’t
resource-oriented. These aren’t the only
requirements, but they’re good rules of thumb.
                                    From RESTful Web Services[3]
HTTP Methods
How are you manipulating a resource?
We’ll cover four of the eight methods...
GET
  • GET a representation of a resources.
  • Safe: Can't hold the user responsible for side-effects.
  • Idempotent: N > 0 identical requests are each the same
      as a single request.
  •   Cacheable.

Example:
GET /people HTTP/1.1


Note that the HTTP request and response examples in this
presentation are meant to be illustrative and are not
always complete. Some HTTP headers may be missing.
More on Safety
A hit counter is generally "safe". Yes, it changes state
but the user is not held accountable for that state
transition.
Deleting something is not safe: you've held the user
accountable. For example, Google Web Accelerator
(cache pre-fetching) broke 37signals' Backpack web
application because they were using GET to delete
information[4].
POST
  •   POST a new representation of a resource.
  •   New resource is subordinate to the requested resource.
  •   Not safe.
  •   Not idempotent.
  •   Can be cached only through the Cache-Control or
      Expires header elds.

Example:
POST /people HTTP/1.1
Content-Type: application/x-www-form-urlencoded
fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F
PUT
  • PUT a modi ed representation of a resource.
  • Not safe.
  • Idempotent: PUTting the same thing multiple times is
      the same as doing it once.
  •   Responses are not cacheable.

Example:
PUT /people/bradley-holt HTTP/1.1
Content-Type: application/x-www-form-urlencoded
fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F
DELETE
  • DELETE a resource.
  • Not safe.
  • Idempotent. Deleting something multiple times is the
      same as doing it once.
  •   Responses are not cacheable.

Example:
DELETE /people/bradley-holt HTTP/1.1
HTTP Status Codes
What was the result of your request?
A few examples...[5]
200 OK
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
  <title>Bradley Holt</title>
</head>
<body>
<div class="vcard">
  <a class="url fn" href="http://bradley-holt.blogspot.com/">Bradley Holt</a>
</div>
</body>
</html>
201 Created
Request:
POST /people HTTP/1.1
Content-Type: application/x-www-form-urlencoded
fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F


Response:
HTTP/1.1 201 Created
Location: /people/bradley-holt
202 Accepted
Request:
POST /people HTTP/1.1
Content-Type: application/x-www-form-urlencoded
fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F


Response:
HTTP/1.1 202 Accepted
Location: /queue/4jn6rk
301 Moved Permanently
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 301 Moved Permanently
Location: /people/BradleyHolt
302 Found
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 302 Found
Location: /people/BradleyHolt
400 Bad Request
Request:
POST /people HTTP/1.1
Content-Type: application/x-www-form-urlencoded
fn=Bradley+Holt&url=bradley-holt.blogspot.com


Response:
HTTP/1.1 400 Bad Request
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
  <title>Bradley Holt</title>
</head>
<body>
<p>URL is not valid.</p>
</body>
</html>
401 Unauthorized
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: BASIC realm="Area 51"
403 Forbidden
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 403 Forbidden
404 Not Found
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 404 Not Found
405 Method Not Allowed
Request:
POST /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 405 Method Not Allowed
Allow: GET, PUT, DELETE
409 Con ict
Request:
PUT /people/bradley-holt HTTP/1.1
Content-Type: application/x-www-form-urlencoded
fn=Bradley+Holt&url=http%3A%2F%www.foundline.com%2F&revision=5


Response:
HTTP/1.1 409 Conflict
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
  <title>Conflict</title>
</head>
<body>
<p>You are editing revision 5 and the latest revision number is 6.</p>
</body>
</html>
418 I’m A Teapot
According to the Hyper Text Coffee Pot
Control Protocol (HTCPCP/1.0)[6]:
Any attempt to brew coffee with a teapot should result
in the error code "418 I'm a teapot". The resulting entity
body MAY be short and stout.




                                                                       Clipped photo by revolution cycle / CC BY 2.0
                                                         http://www. ickr.com/photos/11795120@N06/3832234809/
500 Internal Server Error
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 500 Internal Server Error
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
  <title>Internal Server Error</title>
</head>
<body>
<p>Oops, someone broke the application.</p>
</body>
</html>
503 Service Unavailable
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 503 Service Unavailable
Retry-After: 120
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
  <title>Service Unavailable</title>
</head>
<body>
<p>Try again in two minutes.</p>
</body>
</html>
Uniform Interface
Loose coupling and self-described messages
versus ne-grained functionality.
Uniform Interface
• URI identi es the resource.
• HTTP method says how we're manipulating the
    resource.
•   Entity-header elds and entity-body[7] represent the
    resource.
•   Requests and responses are self-descriptive and
    stateless.
Hypermedia As The Engine Of
Application State (HATEOAS)
From Chapter 5 of the Fielding Dissertation[8]:
In order to obtain a uniform interface, multiple architectural constraints are
needed to guide the behavior of components. REST is de ned by four interface
constraints: identi cation of resources; manipulation of resources through
representations; self-descriptive messages; and, hypermedia as the engine of
application state.
State of What?
Wait, you just said requests and responses
are "stateless" and now you're talking about
application state?
Requests and Responses
• Each request and each response is, itself stateless
    (forget about cookies for a minute).
•   All relevant state information is included in the request
    or response.
•   Not just state, but state transitions can be part of a
    request: POST, PUT and DELETE can change state on
    the server.
Hypermedia
•   XHTML
•   HTML 5
•   microformats
•   RDFa
•   URI Templates
•   WADL
•   Atom
Follow the Hyperlinks
• Link from current resource to another resource
• Form to nd resources (i.e. a "search" form)
• Form to manipulate resource's state
 (via POST, PUT or DELETE)
RESTful Implementations
REST is just an architectural style.
Implementations can vary in how RESTful they are.
AtomPub
• An actual protocol that is RESTful
• Uses XML document hypermedia formats to represent
    entities
•   Originally designed for publishing blogs
•   Used as the base for many RESTful web services
    including:
     • Google Data APIs (GData)
     • Amazon Simple Storage Service (Amazon S3)
     • Windows Azure Platform
GET Atom Service
                    Document
Request:
GET / HTTP/1.1


Response:
HTTP/1.1 200 OK
Content-Type: application/atomsvc+xml
<?xml version="1.0" encoding="utf-8"?>
<service xmlns="http://www.w3.org/2007/app"
         xmlns:atom="http://www.w3.org/2005/Atom">
  <workspace>
    <atom:title>Blog</atom:title>
    <collection href="http://example.org/blog">
      <atom:title>Blog Entries</atom:title>
    </collection>
    <collection href="http://example.org/media">
      <atom:title>Media</atom:title>
      <accept>image/png</accept>
      <accept>image/jpeg</accept>
      <accept>image/gif</accept>
    </collection>
  </workspace>
</service>
Note: Service Document tells us everything we need to know to get started (loose coupling). For example, it
tells us the URIs of the collections to GET or POST to. URIs are up to the server to decide and should be opaque
to the client.
GET Atom Collection
           Document
Request:
GET /blog HTTP/1.1


Response:
HTTP/1.1 200 OK
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Blog Entries</title>
  <link rel="self" href="http://example.org/blog"/>
  <updated>2009-09-01T20:28:54Z</updated>
  <id>urn:uuid:17040b30-9737-11de-8a39-0800200c9a66</id>
</feed>
POST Entry to Atom
       Collection Document
Request:
POST /blog HTTP/1.1
Slug: =?utf-8?q?blog-entry?=
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>A Blog Entry</title>
  <updated>2009-09-01T20:32:06Z</updated>
  <summary>Summary of my blog entry...</summary>
</entry>



Response:
HTTP/1.1 201 Created
Location: /blog/blog-entry
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>A Blog Entry</title>
  <link rel="edit" href="http://example.org/blog/blog-entry"/>
  <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id>
  <updated>2009-09-01T20:32:06Z</updated>
  <summary>Summary of my blog entry...</summary>
</entry>
GET Atom Collection
         Document (again)
Request:
GET /blog HTTP/1.1


Response:
HTTP/1.1 200 OK
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Blog Entries</title>
  <link rel="self" href="http://example.org/blog"/>
  <updated>2009-09-01T20:32:06Z</updated>
  <id>urn:uuid:17040b30-9737-11de-8a39-0800200c9a66</id>
  <entry>
    <title>A Blog Entry</title>
    <link rel="edit" href="http://example.org/blog/blog-entry"/>
    <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id>
    <updated>2009-09-01T20:32:06Z</updated>
    <summary>Summary of my blog entry...</summary>
  </entry>
</feed>
GET Atom Entry
                Document
Request:
GET /blog/blog-entry HTTP/1.1


Response:
HTTP/1.1 200 OK
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>A Blog Entry</title>
  <link rel="edit" href="http://example.org/blog/blog-entry"/>
  <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id>
  <updated>2009-09-01T20:32:06Z</updated>
  <summary>Summary of my blog entry...</summary>
</entry>
PUT Atom Entry
                  Document
Request:
PUT /blog/blog-entry HTTP/1.1
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>A Blog Entry</title>
  <updated>2009-09-01T20:34:51Z</updated>
  <summary>Updated summary...</summary>
</entry>


Response:
HTTP/1.1 200 OK
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>A Blog Entry</title>
  <link rel="edit" href="http://example.org/blog/blog-entry"/>
  <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id>
  <updated>2009-09-01T20:34:51Z</updated>
  <summary>Updated summary...</summary>
</entry>
POST Atom Media Entry
         Document
Request:
POST /media HTTP/1.1
Slug: =?utf-8?q?vacation-photo?=
Content-Type: image/png
...binary data...


Response:
HTTP/1.1 201 Created
Location: /media/vacation-photo.png
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>vacation-photo</title>
  <link rel="edit-media" href="http://example.org/media/vacation-photo.png"/>
  <link rel="edit" href="http://example.org/media/vacation-photo"/>
  <id>urn:uuid:00518590-973f-11de-8a39-0800200c9a66</id>
  <updated>2009-09-01T20:37:18Z</updated>
</entry>
Note:
   • edit-media URI represents the actual media
   • edit URI represents the media entry (Atom Entry)
DELETE Atom Entry
            Document
Request:
DELETE /blog/blog-entry HTTP/1.1


Response:
HTTP/1.1 200 OK
Google Calendar API
The Google Calendar Data API allows client
applications to view and update calendar events in
the form of Google Data API feeds.
Your client application can use the Calendar Data
API to create new events, edit or delete existing
events, and query for events that match particular
criteria.
                                 From the Developer's Guide[9]
GET Calendar Feed
Request:
GET /calendar/feeds/default/owncalendars/full HTTP/1.1


Response (truncated):
HTTP/1.1 200 OK
Content-Type: application/atom+xml
<feed xmlns='http://www.w3.org/2005/Atom'
      xmlns:gCal='http://schemas.google.com/gCal/2005'>
  <id>http://www.google.com/calendar/feeds/default/owncalendars/full</id>
  <updated>2009-09-01T22:16:48.105Z</updated>
  <title type='text'>bradley.holt@gmail.com's Calendar List</title>
  <entry>
    <id>http://www.google.com/calendar/feeds/default/owncalendars/full/bradley.holt
%40gmail.com</id>
    <updated>2009-08-17T06:39:02.000Z</updated>
    <title type='text'>Bradley Holt (personal)</title>
    <link rel='http://schemas.google.com/gCal/2005#eventFeed'
           type='application/atom+xml'
           href='http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/
private/full'/>
    <gCal:timezone value='America/New_York'/>
  </entry>
</feed>
GET Event Feed
Request:
GET /calendar/feeds/bradley.holt%40gmail.com/private/full HTTP/1.1




Response (truncated):
HTTP/1.1 200 OK
Content-Type: application/atom+xml

<feed xmlns='http://www.w3.org/2005/Atom'
      xmlns:batch='http://schemas.google.com/gdata/batch'
      xmlns:gCal='http://schemas.google.com/gCal/2005'
      xmlns:gd='http://schemas.google.com/g/2005'>
  <id>http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full</id>
  <updated>2009-08-17T06:39:02.000Z</updated>
  <title type='text'>Bradley Holt (personal)</title>
  <gCal:timezone value='America/New_York'/>
  <entry>
    <id>http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/t8od3jn8qm65g1bjg78kokukug</id>
    <updated>2009-08-15T18:32:09.000Z</updated>
    <title type='text'>Biking</title>
    <link rel='self' type='application/atom+xml'
           href='http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/t8od3jn8qm65g1bjg78kokukug'/>
    <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/>
    <gd:when startTime='2009-08-15T10:00:00.000-04:00'
              endTime='2009-08-15T14:00:00.000-04:00'/>
    <gd:who rel='http://schemas.google.com/g/2005#event.attendee'
             valueString='bradley.holt@gmail.com'
             email='bradley.holt@gmail.com'/>
    <gd:where valueString=''/>
  </entry>
</feed>
POST an Event to the
                  Feed
Request:
POST /calendar/feeds/bradley.holt%40gmail.com/private/full HTTP/1.1
Content-Type: application/atom+xml

<entry xmlns='http://www.w3.org/2005/Atom'
       xmlns:gd='http://schemas.google.com/g/2005'>
  <updated>2009-09-01T20:48:18.000Z</updated>
  <title type='text'>Haircut</title>
  <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/>
  <gd:when startTime='2009-09-17T18:00:00.000-04:00'
           endTime='2009-09-17T18:30:00.000-04:00'/>
  <gd:who rel='http://schemas.google.com/g/2005#event.attendee'
          valueString='bradley.holt@gmail.com'
          email='bradley.holt@gmail.com'/>
  <gd:where valueString='Barber Shop'/>
</entry>




Response (truncated):
HTTP/1.1 201 Created
Content-Type: application/atom+xml

<entry xmlns='http://www.w3.org/2005/Atom'
       xmlns:batch='http://schemas.google.com/gdata/batch'
       xmlns:gd='http://schemas.google.com/g/2005'>
  <id>http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/xuid3dn5dm65gdbs78k5o3koe</id>
  <updated>2009-09-01T20:48:18.000Z</updated>
  <title type='text'>Haircut</title>
  <link rel='self' type='application/atom+xml'
         href='http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/xuid3dn5dm65gdbs78k5o3koe'/>
  <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/>
  <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/>
  <gd:when startTime='2009-09-17T18:00:00.000-04:00'
            endTime='2009-09-17T18:30:00.000-04:00'/>
  <gd:who rel='http://schemas.google.com/g/2005#event.attendee'
           valueString='bradley.holt@gmail.com'
           email='bradley.holt@gmail.com'/>
  <gd:where valueString='Barber Shop'/>
</entry>
Cache-Control
  • Allows client and server to control caching of resource.
  • An example of why URIs are important (cache only applies
      to a given URI).
  •   Reduces latency.
  •   Reduces network traffic.
  •   Cached by: browser, proxy, gateway.

Request:
GET /people/bradley-holt HTTP/1.1
Cache-Control: max-age=1800


Response:
HTTP/1.1 200 OK
Content-Type: text/html
Cache-Control: max-age=3600
...HTML data...
Conditional GET
• An entity tag (ETag) allows for a conditional GET.
• An example of why URIs are important (conditional GET
    only applies to a given URI).
•   Reduces latency.
•   Reduces network traffic.
Conditional GET (continued)
Request:
GET /people/bradley-holt HTTP/1.1


Response:
HTTP/1.1 200 OK
Content-Type: text/html
ETag: 6f6327696a7c8c6e7e
...HTML data...


Request:
GET /people/bradley-holt HTTP/1.1
If-None-Match: 6f6327696a7c8c6e7e


Response:
HTTP/1.1 304 Not Modified
Content Negotiation
   • Different representations of a resource served by the same
     URI.

Request HTML:
GET /people/bradley-holt HTTP/1.1
Accept: text/html


Response:
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
  <title>Bradley Holt</title>
</head>
<body>
<div class="vcard">
  <a class="url fn" href="http://bradley-holt.blogspot.com/">Bradley Holt</a>
</div>
</body>
</html>
Content Negotiation
                             (continued)
Request Atom:
GET /people/bradley-holt HTTP/1.1
Accept: application/atom+xml


Response:
HTTP/1.1 200 OK
Content-Type: application/atom+xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Bradley Holt</title>
  <link rel="edit" href="http://example.org/people/bradley-holt"/>
  <id>urn:uuid:e92dbee0-9d99-11de-8a39-0800200c9a66</id>
  <updated>2009-09-09T15:39:08Z</updated>
  <summary>Bradley Holt</summary>
</entry>
Acceptance
• Accept-Charset
  • utf-8
  • iso-8859-1
• Accept-Encoding
  • compress
  • gzip
• 406 Not Acceptable
REST is Not...
•   XML/JSON over HTTP
•   Flickr API
•   Twitter API
•   If it says, "REST API" there's a good chance it isn't RESTful.
Trade-Offs
• No ne-grained function/method calling: course-grained
    representation exchange instead.
•   Uniform interface and loose coupling over efficiency.
Credits
Author: Bradley Holt
Technical Review: Josh Sled
Layout & Design: Jason Pelletier
Photo: Revolution Cycle, Solar Powered Tea Pot, http://www.                     ickr.com/photos/11795120@N06/3832234809/


This presentation licensed under Creative Commons -- Attribution 3.0 United States License.
[1]: Hypertext Transfer Protocol. (2009, August 25). In Wikipedia, The Free Encyclopedia. Retrieved August 25, 2009, from
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
[2]: HTTP/1.1: Method De nitions. (n.d.). Retrieved August 26, 2009, from World Wide Web Consortium - Web Standards:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
[3]: Richardson, L., & Ruby, S. (2007). RESTful Web Services. Sebastopol, CA: O’Reilly Media, Inc.
[4]: Google Web Accelerator: Hey, not so fast - an alert for web app designers. (2005, May 6). Retrieved September 8, 2009, from Signal
vs. Noise: http://37signals.com/svn/archives2/google_web_accelerator_hey_not_so_fast_an_alert_for_web_app_designers.php
[5]: HTTP/1.1: Status Code De nitions. (n.d.). Retrieved August 27, 2009, from World Wide Web Consortium - Web Standards:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
[6]: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) (1998, April 1). Retrieved August 31, 2009, from The Internet Engineering Task
Force (IETF): http://www.ietf.org/rfc/rfc2324.txt
[7]: HTTP/1.1: Entity (n.d.). Retrieved September 1, 2009, from World Wide Web Consortium - Web Standards: http://www.w3.org/
Protocols/rfc2616/rfc2616-sec7.html
[8]: Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST) (2000). Retrieved September 1, 2009, from Architectural
Styles and the Design of Network-based Software Architectures: http://www.ics.uci.edu/~ elding/pubs/dissertation/
rest_arch_style.htm#sec_5_1_5
[9]: Developer's Guide - Google Calendar APIs and Tools (n.d.). Retrieved September 1, 2009, from Google Data APIs:
http://code.google.com/apis/calendar/docs/2.0/developers_guide.html

Mais conteúdo relacionado

Mais procurados

Session Server - Maintaing State between several Servers
Session Server - Maintaing State between several ServersSession Server - Maintaing State between several Servers
Session Server - Maintaing State between several ServersStephan Schmidt
 
Class 6 - PHP Web Programming
Class 6 - PHP Web ProgrammingClass 6 - PHP Web Programming
Class 6 - PHP Web ProgrammingAhmed Swilam
 
Go OO! - Real-life Design Patterns in PHP 5
Go OO! - Real-life Design Patterns in PHP 5Go OO! - Real-life Design Patterns in PHP 5
Go OO! - Real-life Design Patterns in PHP 5Stephan Schmidt
 
Flask restfulservices
Flask restfulservicesFlask restfulservices
Flask restfulservicesMarcos Lin
 
Web Development Course: PHP lecture 4
Web Development Course: PHP  lecture 4Web Development Course: PHP  lecture 4
Web Development Course: PHP lecture 4Gheyath M. Othman
 
Web Development Course: PHP lecture 3
Web Development Course: PHP lecture 3Web Development Course: PHP lecture 3
Web Development Course: PHP lecture 3Gheyath M. Othman
 
Web Development Course: PHP lecture 1
Web Development Course: PHP lecture 1Web Development Course: PHP lecture 1
Web Development Course: PHP lecture 1Gheyath M. Othman
 
Streams, sockets and filters oh my!
Streams, sockets and filters oh my!Streams, sockets and filters oh my!
Streams, sockets and filters oh my!Elizabeth Smith
 
Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)julien pauli
 
Php File Operations
Php File OperationsPhp File Operations
Php File Operationsmussawir20
 
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREYBUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREYCodeCore
 
Php file upload, cookies & session
Php file upload, cookies & sessionPhp file upload, cookies & session
Php file upload, cookies & sessionJamshid Hashimi
 

Mais procurados (20)

Session Server - Maintaing State between several Servers
Session Server - Maintaing State between several ServersSession Server - Maintaing State between several Servers
Session Server - Maintaing State between several Servers
 
Class 6 - PHP Web Programming
Class 6 - PHP Web ProgrammingClass 6 - PHP Web Programming
Class 6 - PHP Web Programming
 
Go OO! - Real-life Design Patterns in PHP 5
Go OO! - Real-life Design Patterns in PHP 5Go OO! - Real-life Design Patterns in PHP 5
Go OO! - Real-life Design Patterns in PHP 5
 
Flask restfulservices
Flask restfulservicesFlask restfulservices
Flask restfulservices
 
Web Development Course: PHP lecture 4
Web Development Course: PHP  lecture 4Web Development Course: PHP  lecture 4
Web Development Course: PHP lecture 4
 
PHP FUNCTIONS
PHP FUNCTIONSPHP FUNCTIONS
PHP FUNCTIONS
 
Web Development Course: PHP lecture 3
Web Development Course: PHP lecture 3Web Development Course: PHP lecture 3
Web Development Course: PHP lecture 3
 
Sa
SaSa
Sa
 
Web Development Course: PHP lecture 1
Web Development Course: PHP lecture 1Web Development Course: PHP lecture 1
Web Development Course: PHP lecture 1
 
Php and MySQL
Php and MySQLPhp and MySQL
Php and MySQL
 
Streams, sockets and filters oh my!
Streams, sockets and filters oh my!Streams, sockets and filters oh my!
Streams, sockets and filters oh my!
 
Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)
 
Php File Operations
Php File OperationsPhp File Operations
Php File Operations
 
WP HTTP API
WP HTTP APIWP HTTP API
WP HTTP API
 
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREYBUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
 
Php file upload, cookies & session
Php file upload, cookies & sessionPhp file upload, cookies & session
Php file upload, cookies & session
 
Cross platform php
Cross platform phpCross platform php
Cross platform php
 
Key features PHP 5.3 - 5.6
Key features PHP 5.3 - 5.6Key features PHP 5.3 - 5.6
Key features PHP 5.3 - 5.6
 
PEAR For The Masses
PEAR For The MassesPEAR For The Masses
PEAR For The Masses
 
PHP POWERPOINT SLIDES
PHP POWERPOINT SLIDESPHP POWERPOINT SLIDES
PHP POWERPOINT SLIDES
 

Semelhante a Resource-Oriented Web Services

Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2Sumy PHP User Grpoup
 
RESTful SOA - 中科院暑期讲座
RESTful SOA - 中科院暑期讲座RESTful SOA - 中科院暑期讲座
RESTful SOA - 中科院暑期讲座Li Yi
 
2014 database - course 1 - www introduction
2014 database - course 1 - www introduction2014 database - course 1 - www introduction
2014 database - course 1 - www introductionHung-yu Lin
 
01. http basics v27
01. http basics v2701. http basics v27
01. http basics v27Eoin Keary
 
KMUTNB - Internet Programming 2/7
KMUTNB - Internet Programming 2/7KMUTNB - Internet Programming 2/7
KMUTNB - Internet Programming 2/7phuphax
 
Introduction to the World Wide Web
Introduction to the World Wide WebIntroduction to the World Wide Web
Introduction to the World Wide WebAbdalla Mahmoud
 
HTTP fundamentals for developers
HTTP fundamentals for developersHTTP fundamentals for developers
HTTP fundamentals for developersMario Cardinal
 
REST in ( a mobile ) peace @ WHYMCA 05-21-2011
REST in ( a mobile ) peace @ WHYMCA 05-21-2011REST in ( a mobile ) peace @ WHYMCA 05-21-2011
REST in ( a mobile ) peace @ WHYMCA 05-21-2011Alessandro Nadalin
 
Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...
Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...
Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...ruyalarcon
 
REST Introduction (PHP London)
REST Introduction (PHP London)REST Introduction (PHP London)
REST Introduction (PHP London)Paul James
 
REST-API introduction for developers
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developersPatrick Savalle
 
rest-api-basics.pptx
rest-api-basics.pptxrest-api-basics.pptx
rest-api-basics.pptxAgungSutikno1
 
Restful web-services
Restful web-servicesRestful web-services
Restful web-servicesrporwal
 
A RESTful introduction
A RESTful introductionA RESTful introduction
A RESTful introductionDaniel Toader
 

Semelhante a Resource-Oriented Web Services (20)

Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2Service approach for development Rest API in Symfony2
Service approach for development Rest API in Symfony2
 
HTTP Basics Demo
HTTP Basics DemoHTTP Basics Demo
HTTP Basics Demo
 
Web Scraping with PHP
Web Scraping with PHPWeb Scraping with PHP
Web Scraping with PHP
 
RESTful SOA - 中科院暑期讲座
RESTful SOA - 中科院暑期讲座RESTful SOA - 中科院暑期讲座
RESTful SOA - 中科院暑期讲座
 
Great webapis
Great webapisGreat webapis
Great webapis
 
2014 database - course 1 - www introduction
2014 database - course 1 - www introduction2014 database - course 1 - www introduction
2014 database - course 1 - www introduction
 
01. http basics v27
01. http basics v2701. http basics v27
01. http basics v27
 
KMUTNB - Internet Programming 2/7
KMUTNB - Internet Programming 2/7KMUTNB - Internet Programming 2/7
KMUTNB - Internet Programming 2/7
 
Introduction to the World Wide Web
Introduction to the World Wide WebIntroduction to the World Wide Web
Introduction to the World Wide Web
 
HTTP fundamentals for developers
HTTP fundamentals for developersHTTP fundamentals for developers
HTTP fundamentals for developers
 
WWW and HTTP
WWW and HTTPWWW and HTTP
WWW and HTTP
 
REST in ( a mobile ) peace @ WHYMCA 05-21-2011
REST in ( a mobile ) peace @ WHYMCA 05-21-2011REST in ( a mobile ) peace @ WHYMCA 05-21-2011
REST in ( a mobile ) peace @ WHYMCA 05-21-2011
 
Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...
Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...
Fulfilling the Hypermedia Constraint via HTTP OPTIONS, The HTTP Vocabulary In...
 
REST Introduction (PHP London)
REST Introduction (PHP London)REST Introduction (PHP London)
REST Introduction (PHP London)
 
Introduction To REST
Introduction To RESTIntroduction To REST
Introduction To REST
 
REST-API introduction for developers
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developers
 
rest-api-basics.pptx
rest-api-basics.pptxrest-api-basics.pptx
rest-api-basics.pptx
 
Restful web-services
Restful web-servicesRestful web-services
Restful web-services
 
A RESTful introduction
A RESTful introductionA RESTful introduction
A RESTful introduction
 
Web Services Tutorial
Web Services TutorialWeb Services Tutorial
Web Services Tutorial
 

Mais de Bradley Holt

Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012Bradley Holt
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven DesignBradley Holt
 
Entity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf BostonEntity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf BostonBradley Holt
 
CouchConf NYC CouchApps
CouchConf NYC CouchAppsCouchConf NYC CouchApps
CouchConf NYC CouchAppsBradley Holt
 
ZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven DesignZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven DesignBradley Holt
 
ZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDBZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDBBradley Holt
 
jQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchAppsjQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchAppsBradley Holt
 
OSCON 2011 CouchApps
OSCON 2011 CouchAppsOSCON 2011 CouchApps
OSCON 2011 CouchAppsBradley Holt
 
OSCON 2011 Learning CouchDB
OSCON 2011 Learning CouchDBOSCON 2011 Learning CouchDB
OSCON 2011 Learning CouchDBBradley Holt
 
Load Balancing with Apache
Load Balancing with ApacheLoad Balancing with Apache
Load Balancing with ApacheBradley Holt
 
CouchDB at New York PHP
CouchDB at New York PHPCouchDB at New York PHP
CouchDB at New York PHPBradley Holt
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHPBradley Holt
 
Zend Framework Quick Start Walkthrough
Zend Framework Quick Start WalkthroughZend Framework Quick Start Walkthrough
Zend Framework Quick Start WalkthroughBradley Holt
 
Burlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion PresentationBurlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion PresentationBradley Holt
 

Mais de Bradley Holt (15)

Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012Domain-Driven Design at ZendCon 2012
Domain-Driven Design at ZendCon 2012
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Entity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf BostonEntity Relationships in a Document Database at CouchConf Boston
Entity Relationships in a Document Database at CouchConf Boston
 
CouchConf NYC CouchApps
CouchConf NYC CouchAppsCouchConf NYC CouchApps
CouchConf NYC CouchApps
 
ZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven DesignZendCon 2011 UnCon Domain-Driven Design
ZendCon 2011 UnCon Domain-Driven Design
 
ZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDBZendCon 2011 Learning CouchDB
ZendCon 2011 Learning CouchDB
 
jQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchAppsjQuery Conference Boston 2011 CouchApps
jQuery Conference Boston 2011 CouchApps
 
OSCON 2011 CouchApps
OSCON 2011 CouchAppsOSCON 2011 CouchApps
OSCON 2011 CouchApps
 
OSCON 2011 Learning CouchDB
OSCON 2011 Learning CouchDBOSCON 2011 Learning CouchDB
OSCON 2011 Learning CouchDB
 
Load Balancing with Apache
Load Balancing with ApacheLoad Balancing with Apache
Load Balancing with Apache
 
CouchDB at New York PHP
CouchDB at New York PHPCouchDB at New York PHP
CouchDB at New York PHP
 
Intermediate PHP
Intermediate PHPIntermediate PHP
Intermediate PHP
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
Zend Framework Quick Start Walkthrough
Zend Framework Quick Start WalkthroughZend Framework Quick Start Walkthrough
Zend Framework Quick Start Walkthrough
 
Burlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion PresentationBurlington, VT PHP Users Group Subversion Presentation
Burlington, VT PHP Users Group Subversion Presentation
 

Último

The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 

Último (20)

The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 

Resource-Oriented Web Services

  • 1. Resource-Oriented Web Services Applying the REST Architectural Style
  • 2. This presentation will discuss how the Representational State Transfer (REST) architectural style can be applied to the design of your web services. You will learn how to use HTTP methods and status codes properly and we will discuss how to use Hypermedia As The Engine Of Application State (HATEOAS). The principles of REST and HATEOAS will be demonstrated through the Atom Publishing Protocol (AtomPub) using the Google Data APIs and other AtomPub implementations as examples.
  • 3. HTTP "Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. Its use for retrieving inter-linked resources led to the establishment of the World Wide Web."[1]
  • 4. Methods and Resources HTTP methods are the actions that can be performed on resources.
  • 5. Uniform Resource Identi ers (URIs) Resources are identi ed by a URI.
  • 6. URIs Example URIs: http://www.example.org/people http://www.example.org/people/bradley-holt Examples of resources could include: • documents • people • places • things • abstract concepts (e.g. processes, transactions)
  • 7. Limited Vocabulary There are only 8 methods: HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT (we're only going to talk about 4 of them); but you get to de ne your own resources.[2]
  • 8. REST Architecture • HTTP is just one (very popular) instance of the REST architecture. • You can use HTTP correctly and not be RESTful and you can use REST without HTTP. • REST is about de ning a uniform interface. Example of a non-RESTful standard based on HTTP: • WebDAV
  • 9. What Makes a Service RESTful? If the HTTP method doesn’t match the method information, the service isn’t RESTful. If the scoping information isn’t in the URI, the service isn’t resource-oriented. These aren’t the only requirements, but they’re good rules of thumb. From RESTful Web Services[3]
  • 10. HTTP Methods How are you manipulating a resource? We’ll cover four of the eight methods...
  • 11. GET • GET a representation of a resources. • Safe: Can't hold the user responsible for side-effects. • Idempotent: N > 0 identical requests are each the same as a single request. • Cacheable. Example: GET /people HTTP/1.1 Note that the HTTP request and response examples in this presentation are meant to be illustrative and are not always complete. Some HTTP headers may be missing.
  • 12. More on Safety A hit counter is generally "safe". Yes, it changes state but the user is not held accountable for that state transition. Deleting something is not safe: you've held the user accountable. For example, Google Web Accelerator (cache pre-fetching) broke 37signals' Backpack web application because they were using GET to delete information[4].
  • 13. POST • POST a new representation of a resource. • New resource is subordinate to the requested resource. • Not safe. • Not idempotent. • Can be cached only through the Cache-Control or Expires header elds. Example: POST /people HTTP/1.1 Content-Type: application/x-www-form-urlencoded fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F
  • 14. PUT • PUT a modi ed representation of a resource. • Not safe. • Idempotent: PUTting the same thing multiple times is the same as doing it once. • Responses are not cacheable. Example: PUT /people/bradley-holt HTTP/1.1 Content-Type: application/x-www-form-urlencoded fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F
  • 15. DELETE • DELETE a resource. • Not safe. • Idempotent. Deleting something multiple times is the same as doing it once. • Responses are not cacheable. Example: DELETE /people/bradley-holt HTTP/1.1
  • 16. HTTP Status Codes What was the result of your request? A few examples...[5]
  • 17. 200 OK Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 200 OK Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Bradley Holt</title> </head> <body> <div class="vcard"> <a class="url fn" href="http://bradley-holt.blogspot.com/">Bradley Holt</a> </div> </body> </html>
  • 18. 201 Created Request: POST /people HTTP/1.1 Content-Type: application/x-www-form-urlencoded fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F Response: HTTP/1.1 201 Created Location: /people/bradley-holt
  • 19. 202 Accepted Request: POST /people HTTP/1.1 Content-Type: application/x-www-form-urlencoded fn=Bradley+Holt&url=http%3A%2F%2Fbradley-holt.blogspot.com%2F Response: HTTP/1.1 202 Accepted Location: /queue/4jn6rk
  • 20. 301 Moved Permanently Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 301 Moved Permanently Location: /people/BradleyHolt
  • 21. 302 Found Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 302 Found Location: /people/BradleyHolt
  • 22. 400 Bad Request Request: POST /people HTTP/1.1 Content-Type: application/x-www-form-urlencoded fn=Bradley+Holt&url=bradley-holt.blogspot.com Response: HTTP/1.1 400 Bad Request Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Bradley Holt</title> </head> <body> <p>URL is not valid.</p> </body> </html>
  • 23. 401 Unauthorized Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 401 Unauthorized WWW-Authenticate: BASIC realm="Area 51"
  • 24. 403 Forbidden Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 403 Forbidden
  • 25. 404 Not Found Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 404 Not Found
  • 26. 405 Method Not Allowed Request: POST /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 405 Method Not Allowed Allow: GET, PUT, DELETE
  • 27. 409 Con ict Request: PUT /people/bradley-holt HTTP/1.1 Content-Type: application/x-www-form-urlencoded fn=Bradley+Holt&url=http%3A%2F%www.foundline.com%2F&revision=5 Response: HTTP/1.1 409 Conflict Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Conflict</title> </head> <body> <p>You are editing revision 5 and the latest revision number is 6.</p> </body> </html>
  • 28. 418 I’m A Teapot According to the Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)[6]: Any attempt to brew coffee with a teapot should result in the error code "418 I'm a teapot". The resulting entity body MAY be short and stout. Clipped photo by revolution cycle / CC BY 2.0 http://www. ickr.com/photos/11795120@N06/3832234809/
  • 29. 500 Internal Server Error Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 500 Internal Server Error Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Internal Server Error</title> </head> <body> <p>Oops, someone broke the application.</p> </body> </html>
  • 30. 503 Service Unavailable Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 503 Service Unavailable Retry-After: 120 Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Service Unavailable</title> </head> <body> <p>Try again in two minutes.</p> </body> </html>
  • 31. Uniform Interface Loose coupling and self-described messages versus ne-grained functionality.
  • 32. Uniform Interface • URI identi es the resource. • HTTP method says how we're manipulating the resource. • Entity-header elds and entity-body[7] represent the resource. • Requests and responses are self-descriptive and stateless.
  • 33. Hypermedia As The Engine Of Application State (HATEOAS) From Chapter 5 of the Fielding Dissertation[8]: In order to obtain a uniform interface, multiple architectural constraints are needed to guide the behavior of components. REST is de ned by four interface constraints: identi cation of resources; manipulation of resources through representations; self-descriptive messages; and, hypermedia as the engine of application state.
  • 34. State of What? Wait, you just said requests and responses are "stateless" and now you're talking about application state?
  • 35. Requests and Responses • Each request and each response is, itself stateless (forget about cookies for a minute). • All relevant state information is included in the request or response. • Not just state, but state transitions can be part of a request: POST, PUT and DELETE can change state on the server.
  • 36. Hypermedia • XHTML • HTML 5 • microformats • RDFa • URI Templates • WADL • Atom
  • 37. Follow the Hyperlinks • Link from current resource to another resource • Form to nd resources (i.e. a "search" form) • Form to manipulate resource's state (via POST, PUT or DELETE)
  • 38. RESTful Implementations REST is just an architectural style. Implementations can vary in how RESTful they are.
  • 39. AtomPub • An actual protocol that is RESTful • Uses XML document hypermedia formats to represent entities • Originally designed for publishing blogs • Used as the base for many RESTful web services including: • Google Data APIs (GData) • Amazon Simple Storage Service (Amazon S3) • Windows Azure Platform
  • 40. GET Atom Service Document Request: GET / HTTP/1.1 Response: HTTP/1.1 200 OK Content-Type: application/atomsvc+xml <?xml version="1.0" encoding="utf-8"?> <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Blog</atom:title> <collection href="http://example.org/blog"> <atom:title>Blog Entries</atom:title> </collection> <collection href="http://example.org/media"> <atom:title>Media</atom:title> <accept>image/png</accept> <accept>image/jpeg</accept> <accept>image/gif</accept> </collection> </workspace> </service> Note: Service Document tells us everything we need to know to get started (loose coupling). For example, it tells us the URIs of the collections to GET or POST to. URIs are up to the server to decide and should be opaque to the client.
  • 41. GET Atom Collection Document Request: GET /blog HTTP/1.1 Response: HTTP/1.1 200 OK Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Blog Entries</title> <link rel="self" href="http://example.org/blog"/> <updated>2009-09-01T20:28:54Z</updated> <id>urn:uuid:17040b30-9737-11de-8a39-0800200c9a66</id> </feed>
  • 42. POST Entry to Atom Collection Document Request: POST /blog HTTP/1.1 Slug: =?utf-8?q?blog-entry?= Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>A Blog Entry</title> <updated>2009-09-01T20:32:06Z</updated> <summary>Summary of my blog entry...</summary> </entry> Response: HTTP/1.1 201 Created Location: /blog/blog-entry Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>A Blog Entry</title> <link rel="edit" href="http://example.org/blog/blog-entry"/> <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id> <updated>2009-09-01T20:32:06Z</updated> <summary>Summary of my blog entry...</summary> </entry>
  • 43. GET Atom Collection Document (again) Request: GET /blog HTTP/1.1 Response: HTTP/1.1 200 OK Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Blog Entries</title> <link rel="self" href="http://example.org/blog"/> <updated>2009-09-01T20:32:06Z</updated> <id>urn:uuid:17040b30-9737-11de-8a39-0800200c9a66</id> <entry> <title>A Blog Entry</title> <link rel="edit" href="http://example.org/blog/blog-entry"/> <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id> <updated>2009-09-01T20:32:06Z</updated> <summary>Summary of my blog entry...</summary> </entry> </feed>
  • 44. GET Atom Entry Document Request: GET /blog/blog-entry HTTP/1.1 Response: HTTP/1.1 200 OK Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>A Blog Entry</title> <link rel="edit" href="http://example.org/blog/blog-entry"/> <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id> <updated>2009-09-01T20:32:06Z</updated> <summary>Summary of my blog entry...</summary> </entry>
  • 45. PUT Atom Entry Document Request: PUT /blog/blog-entry HTTP/1.1 Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>A Blog Entry</title> <updated>2009-09-01T20:34:51Z</updated> <summary>Updated summary...</summary> </entry> Response: HTTP/1.1 200 OK Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>A Blog Entry</title> <link rel="edit" href="http://example.org/blog/blog-entry"/> <id>urn:uuid:337f26a0-9737-11de-8a39-0800200c9a66</id> <updated>2009-09-01T20:34:51Z</updated> <summary>Updated summary...</summary> </entry>
  • 46. POST Atom Media Entry Document Request: POST /media HTTP/1.1 Slug: =?utf-8?q?vacation-photo?= Content-Type: image/png ...binary data... Response: HTTP/1.1 201 Created Location: /media/vacation-photo.png Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>vacation-photo</title> <link rel="edit-media" href="http://example.org/media/vacation-photo.png"/> <link rel="edit" href="http://example.org/media/vacation-photo"/> <id>urn:uuid:00518590-973f-11de-8a39-0800200c9a66</id> <updated>2009-09-01T20:37:18Z</updated> </entry> Note: • edit-media URI represents the actual media • edit URI represents the media entry (Atom Entry)
  • 47. DELETE Atom Entry Document Request: DELETE /blog/blog-entry HTTP/1.1 Response: HTTP/1.1 200 OK
  • 48. Google Calendar API The Google Calendar Data API allows client applications to view and update calendar events in the form of Google Data API feeds. Your client application can use the Calendar Data API to create new events, edit or delete existing events, and query for events that match particular criteria. From the Developer's Guide[9]
  • 49. GET Calendar Feed Request: GET /calendar/feeds/default/owncalendars/full HTTP/1.1 Response (truncated): HTTP/1.1 200 OK Content-Type: application/atom+xml <feed xmlns='http://www.w3.org/2005/Atom' xmlns:gCal='http://schemas.google.com/gCal/2005'> <id>http://www.google.com/calendar/feeds/default/owncalendars/full</id> <updated>2009-09-01T22:16:48.105Z</updated> <title type='text'>bradley.holt@gmail.com's Calendar List</title> <entry> <id>http://www.google.com/calendar/feeds/default/owncalendars/full/bradley.holt %40gmail.com</id> <updated>2009-08-17T06:39:02.000Z</updated> <title type='text'>Bradley Holt (personal)</title> <link rel='http://schemas.google.com/gCal/2005#eventFeed' type='application/atom+xml' href='http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/ private/full'/> <gCal:timezone value='America/New_York'/> </entry> </feed>
  • 50. GET Event Feed Request: GET /calendar/feeds/bradley.holt%40gmail.com/private/full HTTP/1.1 Response (truncated): HTTP/1.1 200 OK Content-Type: application/atom+xml <feed xmlns='http://www.w3.org/2005/Atom' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gCal='http://schemas.google.com/gCal/2005' xmlns:gd='http://schemas.google.com/g/2005'> <id>http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full</id> <updated>2009-08-17T06:39:02.000Z</updated> <title type='text'>Bradley Holt (personal)</title> <gCal:timezone value='America/New_York'/> <entry> <id>http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/t8od3jn8qm65g1bjg78kokukug</id> <updated>2009-08-15T18:32:09.000Z</updated> <title type='text'>Biking</title> <link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/t8od3jn8qm65g1bjg78kokukug'/> <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/> <gd:when startTime='2009-08-15T10:00:00.000-04:00' endTime='2009-08-15T14:00:00.000-04:00'/> <gd:who rel='http://schemas.google.com/g/2005#event.attendee' valueString='bradley.holt@gmail.com' email='bradley.holt@gmail.com'/> <gd:where valueString=''/> </entry> </feed>
  • 51. POST an Event to the Feed Request: POST /calendar/feeds/bradley.holt%40gmail.com/private/full HTTP/1.1 Content-Type: application/atom+xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'> <updated>2009-09-01T20:48:18.000Z</updated> <title type='text'>Haircut</title> <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/> <gd:when startTime='2009-09-17T18:00:00.000-04:00' endTime='2009-09-17T18:30:00.000-04:00'/> <gd:who rel='http://schemas.google.com/g/2005#event.attendee' valueString='bradley.holt@gmail.com' email='bradley.holt@gmail.com'/> <gd:where valueString='Barber Shop'/> </entry> Response (truncated): HTTP/1.1 201 Created Content-Type: application/atom+xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005'> <id>http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/xuid3dn5dm65gdbs78k5o3koe</id> <updated>2009-09-01T20:48:18.000Z</updated> <title type='text'>Haircut</title> <link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/bradley.holt%40gmail.com/private/full/xuid3dn5dm65gdbs78k5o3koe'/> <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/> <gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'/> <gd:when startTime='2009-09-17T18:00:00.000-04:00' endTime='2009-09-17T18:30:00.000-04:00'/> <gd:who rel='http://schemas.google.com/g/2005#event.attendee' valueString='bradley.holt@gmail.com' email='bradley.holt@gmail.com'/> <gd:where valueString='Barber Shop'/> </entry>
  • 52. Cache-Control • Allows client and server to control caching of resource. • An example of why URIs are important (cache only applies to a given URI). • Reduces latency. • Reduces network traffic. • Cached by: browser, proxy, gateway. Request: GET /people/bradley-holt HTTP/1.1 Cache-Control: max-age=1800 Response: HTTP/1.1 200 OK Content-Type: text/html Cache-Control: max-age=3600 ...HTML data...
  • 53. Conditional GET • An entity tag (ETag) allows for a conditional GET. • An example of why URIs are important (conditional GET only applies to a given URI). • Reduces latency. • Reduces network traffic.
  • 54. Conditional GET (continued) Request: GET /people/bradley-holt HTTP/1.1 Response: HTTP/1.1 200 OK Content-Type: text/html ETag: 6f6327696a7c8c6e7e ...HTML data... Request: GET /people/bradley-holt HTTP/1.1 If-None-Match: 6f6327696a7c8c6e7e Response: HTTP/1.1 304 Not Modified
  • 55. Content Negotiation • Different representations of a resource served by the same URI. Request HTML: GET /people/bradley-holt HTTP/1.1 Accept: text/html Response: HTTP/1.1 200 OK Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Bradley Holt</title> </head> <body> <div class="vcard"> <a class="url fn" href="http://bradley-holt.blogspot.com/">Bradley Holt</a> </div> </body> </html>
  • 56. Content Negotiation (continued) Request Atom: GET /people/bradley-holt HTTP/1.1 Accept: application/atom+xml Response: HTTP/1.1 200 OK Content-Type: application/atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>Bradley Holt</title> <link rel="edit" href="http://example.org/people/bradley-holt"/> <id>urn:uuid:e92dbee0-9d99-11de-8a39-0800200c9a66</id> <updated>2009-09-09T15:39:08Z</updated> <summary>Bradley Holt</summary> </entry>
  • 57. Acceptance • Accept-Charset • utf-8 • iso-8859-1 • Accept-Encoding • compress • gzip • 406 Not Acceptable
  • 58. REST is Not... • XML/JSON over HTTP • Flickr API • Twitter API • If it says, "REST API" there's a good chance it isn't RESTful.
  • 59. Trade-Offs • No ne-grained function/method calling: course-grained representation exchange instead. • Uniform interface and loose coupling over efficiency.
  • 60. Credits Author: Bradley Holt Technical Review: Josh Sled Layout & Design: Jason Pelletier Photo: Revolution Cycle, Solar Powered Tea Pot, http://www. ickr.com/photos/11795120@N06/3832234809/ This presentation licensed under Creative Commons -- Attribution 3.0 United States License. [1]: Hypertext Transfer Protocol. (2009, August 25). In Wikipedia, The Free Encyclopedia. Retrieved August 25, 2009, from http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol [2]: HTTP/1.1: Method De nitions. (n.d.). Retrieved August 26, 2009, from World Wide Web Consortium - Web Standards: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html [3]: Richardson, L., & Ruby, S. (2007). RESTful Web Services. Sebastopol, CA: O’Reilly Media, Inc. [4]: Google Web Accelerator: Hey, not so fast - an alert for web app designers. (2005, May 6). Retrieved September 8, 2009, from Signal vs. Noise: http://37signals.com/svn/archives2/google_web_accelerator_hey_not_so_fast_an_alert_for_web_app_designers.php [5]: HTTP/1.1: Status Code De nitions. (n.d.). Retrieved August 27, 2009, from World Wide Web Consortium - Web Standards: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html [6]: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) (1998, April 1). Retrieved August 31, 2009, from The Internet Engineering Task Force (IETF): http://www.ietf.org/rfc/rfc2324.txt [7]: HTTP/1.1: Entity (n.d.). Retrieved September 1, 2009, from World Wide Web Consortium - Web Standards: http://www.w3.org/ Protocols/rfc2616/rfc2616-sec7.html [8]: Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST) (2000). Retrieved September 1, 2009, from Architectural Styles and the Design of Network-based Software Architectures: http://www.ics.uci.edu/~ elding/pubs/dissertation/ rest_arch_style.htm#sec_5_1_5 [9]: Developer's Guide - Google Calendar APIs and Tools (n.d.). Retrieved September 1, 2009, from Google Data APIs: http://code.google.com/apis/calendar/docs/2.0/developers_guide.html