Best Practices for RESTful Web Services

Post on 10-May-2015

503 views 1 download

Tags:

description

When we discuss APIs, most people immediately think of OAuth, GET and POST, and JSON. Few people think of the underlying concepts of nouns and verbs, idempotence, and uniform interfaces. Even less consider how we can combine these concepts into hypermedia to build APIs that are useful, logical, and future-friendly. Join us as we combine the basics, explore the larger concepts, and look at the standards that are leading the way.

Transcript of Best Practices for RESTful Web Services

Best Practices for RESTful Web Services

Joël Franusic, Developer Evangelist, Twilio

Joël FranusicDeveloper Evangelist, Twilio@jfhttps://github.com/jpf

Richardson Maturity Model

Speaking the same language …

“Strictly RESTful”

REST is not a standard

What REST is not …

• Pretty URLs• XML over HTTP• JSON over HTTP

The Constraints•Client-Server•Stateless•Cacheable•Uniform Interfaces•Layered System•Code on Demand (optional)

Let’s get started

Level 0: POX

The Constraints•Client-Server•Stateless•Cacheable•Layered System•Uniform Interfaces•Code on Demand (optional)

Uniform InterfacesFour principles:

1.Identification of Resources2.Manipulation of Resources through these Representations3.Self-descriptive Messages4.Hypermedia as the engine of application state (HATEOAS)

Resources == Nouns

Identification of ResourcesGenerally:•/noun/id•/noun/action/id

Collections too …Generally•/nouns

(notice the above is plural now)

Level 1: Resources

Uniform InterfacesFour principles:

1.Identification of Resources2.Manipulation of Resources through these Representations3.Self-descriptive Messages4.Hypermedia as the engine of application state (HATEOAS)

Manipulation through those Interfaces

Within Twilio:/2010-04-01/Accounts/{AccountSid}/Calls/{CAxxx}/2010-04-01/Accounts/{AccountSid}/Conferences/{CFxxx}/2010-04-01/Accounts/{AccountSid}/Notifications/{NOxxx}/2010-04-01/Accounts/{AccountSid}/Recordings/{RExxx}/2010-04-01/Accounts/{AccountSid}/Queues/{QUxxx}/2010-04-01/Accounts/{AccountSid}/SMS/{SMxxx}/2010-04-01/Accounts/{AccountSid}/Transcripts/{TRxxx}GET {none}POST {only for Calls & SMS}PUT n/aDELETE {only for Recordings}OPTIONS, HEAD, PATCH, TRACE, CONNECT

Level 2: HTTP Verbs

Uniform InterfacesFour principles:

1.Identification of Resources2.Manipulation of Resources through these Representations3.Self-descriptive Messages4.Hypermedia as the engine of application state (HATEOAS)

Self DescriptiveEach message should tell you:•How to process itself•If that resource is cacheable•How to request the next resource

Level 3: Hypermedia Controls

Uniform InterfacesFour principles:

1.Identification of Resources2.Manipulation of Resources through these Representations3.Self-descriptive Messages4.Hypermedia as the engine of application state (HATEOAS)

HATEOAS“Clients make state transitions only through actions that are dynamically identified within hypermedia by the server (e.g., by hyperlinks“Clients make state transitions only through actions that are dynamically identified within hypermedia by the server (e.g., by hyperlinks within hypertext). Except for simple fixed entry points to the application, a client does not assume that any particular action is available for any particular resources beyond those described in representations previously received from the server.”

Source: http://en.wikipedia.org/wiki/Representational_state_transfer#Guiding_principles_of_the_interface (Accessed 2013-11-01)

Choose Your Own Adventure

For example:$ curl https://api.twilio.com/2010-04-01 <?xml version="1.0"?><TwilioResponse> <Version> <Name>2010-04-01</Name> <Uri>/2010-04-01</Uri> <SubresourceUris> <Accounts>/2010-04-01/Accounts</Accounts> </SubresourceUris> </Version></TwilioResponse>

Another example:<TwilioResponse> <Account> <Sid>ACxxxx</Sid> <FriendlyName>Do you like my friendly name?</FriendlyName> <Type>Full</Type> <Status>active</Status> <DateCreated>Wed, 02 Jan 2013 21:37:41 +0000</DateCreated> <DateUpdated>Fri, 04 Jan 2013 01:15:02 +0000</DateUpdated> <AuthToken>redacted</AuthToken> <Uri>/2010-04-01/Accounts/ACxxxx</Uri> <SubresourceUris> <AvailablePhoneNumbers>/2010-04-01/Accounts/ACxxxx/AvailablePhoneNumbers</AvailablePhoneNumbers> <Calls>/2010-04-01/Accounts/ACxxxx/Calls</Calls> <Conferences>/2010-04-01/Accounts/ACxxxx/Conferences</Conferences> <IncomingPhoneNumbers>/2010-04-01/Accounts/ACxxxx/IncomingPhoneNumbers</IncomingPhoneNumbers> <Notifications>/2010-04-01/Accounts/ACxxxx/Notifications</Notifications> <OutgoingCallerIds>/2010-04-01/Accounts/ACxxxx/OutgoingCallerIds</OutgoingCallerIds> <Queues>/2010-04-01/Accounts/ACxxxx/Queues</Queues> <Recordings>/2010-04-01/Accounts/ACxxxx/Recordings</Recordings> <Sandbox>/2010-04-01/Accounts/ACxxxx/Sandbox</Sandbox> <SMSMessages>/2010-04-01/Accounts/ACxxxx/SMS/Messages</SMSMessages> <Transcriptions>/2010-04-01/Accounts/ACxxxx/Transcriptions</Transcriptions> </SubresourceUris> </Account></TwilioResponse>

Another example:<TwilioResponse> <Account> <Sid>ACxxxx</Sid> <FriendlyName>Do you like my friendly name?</FriendlyName> <Type>Full</Type> <Status>active</Status> <DateCreated>Wed, 02 Jan 2013 21:37:41 +0000</DateCreated> <DateUpdated>Fri, 04 Jan 2013 01:15:02 +0000</DateUpdated> <AuthToken>redacted</AuthToken> <Uri>/2010-04-01/Accounts/ACxxxx</Uri> <SubresourceUris> <AvailablePhoneNumbers>/2010-04-01/Accounts/ACxxxx/AvailablePhoneNumbers</AvailablePhoneNumbers>

<Calls>/2010-04-01/Accounts/ACxxxx/Calls</Calls> <Conferences>/2010-04-01/Accounts/ACxxxx/Conferences</Conferences> <IncomingPhoneNumbers>/2010-04-01/Accounts/ACxxxx/IncomingPhoneNumbers</IncomingPhoneNumbers> <Notifications>/2010-04-01/Accounts/ACxxxx/Notifications</Notifications> <OutgoingCallerIds>/2010-04-01/Accounts/ACxxxx/OutgoingCallerIds</OutgoingCallerIds> <Queues>/2010-04-01/Accounts/ACxxxx/Queues</Queues> <Recordings>/2010-04-01/Accounts/ACxxxx/Recordings</Recordings> <Sandbox>/2010-04-01/Accounts/ACxxxx/Sandbox</Sandbox> <SMSMessages>/2010-04-01/Accounts/ACxxxx/SMS/Messages</SMSMessages> <Transcriptions>/2010-04-01/Accounts/ACxxxx/Transcriptions</Transcriptions> </SubresourceUris> </Account></TwilioResponse>

Another example:<TwilioResponse> <Account> <Sid>ACxxxx</Sid> <FriendlyName>Do you like my friendly name?</FriendlyName> <Type>Full</Type> <Status>active</Status> <DateCreated>Wed, 02 Jan 2013 21:37:41 +0000</DateCreated> <DateUpdated>Fri, 04 Jan 2013 01:15:02 +0000</DateUpdated> <AuthToken>redacted</AuthToken> <Uri>/2010-04-01/Accounts/ACxxxx</Uri> <SubresourceUris> <AvailablePhoneNumbers>/2010-04-01/Accounts/ACxxxx/AvailablePhoneNumbers</AvailablePhoneNumbers> <Calls>/2010-04-01/Accounts/ACxxxx/Calls</Calls> <Conferences>/2010-04-01/Accounts/ACxxxx/Conferences</Conferences> <IncomingPhoneNumbers>/2010-04-01/Accounts/ACxxxx/IncomingPhoneNumbers</IncomingPhoneNumbers> <Notifications>/2010-04-01/Accounts/ACxxxx/Notifications</Notifications> <OutgoingCallerIds>/2010-04-01/Accounts/ACxxxx/OutgoingCallerIds</OutgoingCallerIds> <Queues>/2010-04-01/Accounts/ACxxxx/Queues</Queues> <Recordings>/2010-04-01/Accounts/ACxxxx/Recordings</Recordings> <Sandbox>/2010-04-01/Accounts/ACxxxx/Sandbox</Sandbox>

<SMSMessages>/2010-04-01/Accounts/ACxxxx/SMS/Messages</SMSMessages> <Transcriptions>/2010-04-01/Accounts/ACxxxx/Transcriptions</Transcriptions> </SubresourceUris> </Account></TwilioResponse>

Glory of REST.. eh?

Joël Franusic

Developer Evangelist@jf

Additional Resources• http://en.wikipedia.org/wiki/http://en.wikipedia.org/wiki/HATEOAS• http://blog.steveklabnik.com/2011/07/03/nobody-understands-

rest-or-http://blog.steveklabnik.com/2011/07/03/nobody-understands-rest-or-http.html

• http://shop.oreilly.com/product/9780596529260.http://shop.oreilly.com/product/9780596529260.do

• http://http://videos.restfest.org