WhatfettleWeb APIs Are Just Web Sites

Warning

A short presentation on how you might like to build a simple "Web API".

Updated: an accessible version with errata fixes and links:

  1. A Web Friendly API?
  2. Javascript AJAX Python Ruby PHP Perl Curl
  3. [Picture: collection of Web 2.0 logos from flickr, Google, Yahoo!, last.fm, etc]
  4. One thing in common ..
  5. They HATE SOAP
  6. But LOVE The Web
  7. URIs identify stuff
  8. And can be anywhere
  9. [photo of shower head with URI WWW.SPEAKERMAN.COM]
  10. Use cool URIs
  11. Read RFC 2616
  12. Constrain Verbs: GET/HEAD and POST (PUT, DELETE, OPTIONS - YAGNI?)
  13. Ask "IS IT SAFE?" [photo of the dentist from Marathon Man]
  14. Understand HTTP Methods:
      method     safe    idempotent   semantics    resource     cacheable                -----------------------------------------------------------      GET       |  X          X            X           X             X    |      HEAD      |  X          X            X           X             X    |      PUT       |             X            X           X                  |      POST      |                                                    *    |      DELETE    |             X            X           X                  |      OPTIONS   |  X          X            X                              |                -----------------------------------------------------------      PROPFIND  |  X          X            X           X             *    |      PROPPATCH |             X            X           X                  |      MKCOL     |             *            X           X                  |      COPY      |             X            X           X                  |      MOVE      |             ?            X           X                  |      LOCK      |                          X           X                  |      UNLOCK    |             X            X           X                  |      PATCH     |             *            X           X                  |                -----------------------------------------------------------   
  15. think about representations: HTML, RSS/Atom, XML, JSON, whatever
  16. Warning! You are about to see Naked Protocol Headers!
  17. Content-Negotiation:
    HTTP GET ...  Accept: application/weatherml+xml; q=1.0,           application/xml; q=0.8,           text/html; q=0.5
    Apache Server .htaccess  AddType application/weatherml+xml wea     Options +MultiViews       ./index.wea       ./index.xml       ./index.html  
  18. enjoy the free caching
    HTTP GET http://flickr.com/photos/psd/2450160   If-Modified-Since:  Fri, 31 Dec 1999 23:59:59 GMT   If-None-Match: 'guid-21343244324' 
    HTTP/1.1 304 Not Modified
  19. make Phone Call
    HTTP POST http://example.com/calls   Content-Type: application/x-www-form-urlencoded   Accept: text/xml; charset=utf-8     callingParty=tel:+447918808   calledParty=sip:Merlin    =>    HTTP 1.1 201 Created   Location: http://example.com/calls/123213   Content-Type: text/xml; charset=utf-8     <callInfo>     <callId>http://example.com/calls/123213</callId>     <callStatus>Initial</callStatus>  </callInfo>  
  20. get Call Info
    HTTP GET http://example.com/calls/123213   Accept: text/xml     =>     200 OK  Content-Type: text/xml; charset=utf-8     <callInfo>     <callId> http://example.com/user/fred/calls/123213     <callStatus> CallInitial      <callingParty> tel:+447918880...     <calledParty> tel:+447918880...     <timeStarted> 2007-01-09 11:45:20     <duration> 502     <terminationStatus> CallNotTerminated   </callInfo>
  21. end Call
    HTTP POST http://example.com/calls/123213   Content-Type: application/x-www-form-urlencoded     callStatus=Terminated     =>     202 Accepted   Location: http://example.com/calls/123213
  22. list Recent Calls [Feed Icon]
    HTTP GET http://example.com/calls/feed      =>    200 OK   Content-Type: application/atom+xml     <feed xmlns="http://www.w3.org/2005/Atom">     <title>Phone Calls     <link rel="self" href="http://example.com/calls/"           rel="alternate" type="text/html"/>     <updated>2007-01-0911:45:02Z     <author><name>Phonebox     <id>tag:example.com,2007-01-09:/calls     <entry>      <link href="http://example.com/user/psd/calls/1234567/"/>       <title>Call 1234567      <id>tag:example.com/calls/1234567-200701091223313       <summary>CallInformation       <updated>2005-10-13T18:30:02Z     </entry>     <entry>      <link href="http://example.com/user/fred/calls/17231667/"       ...
  23. Overall:
    http://example.com/calls   http://example.com/calls/feed   http://example.com/user/paul/calls/feed   http://example.com/user/paul/calls/7d6374da5   http://example.com/user/paul/calls/search?callingParty=tel:%3A44791888   http://example.com/sms   http://example.com/sms/feed   http://example.com/user/fred/sms/7d6374da5   http://example.com/user/fred/sms/inbox/feed   http://example.com/user/fred/sms/inbox/7d6374da5   http://example.com/user/fred/sms/inbox/search?from=tel:%3A44791888   ....
  24. Yes, Dear Reader, there's no API as such it's just yet another Web site ..
  25. Surf long and prosper!

Technorati Tags: , ,