API Design - 3rd Edition

Apigee | Google Cloud
Apigee | Google CloudAPI Management and Strategy
API Design
3rd Edition



Brian Mulloy
@landlessness
Kevin Swiber     Apigee
@kevinswiber    @apigee
groups.google.com/group/api-craft
youtube.com/apigee
slideshare.net/apigee
@landlessness   @kevinswiber
“   The real issue is about design: designing
    things that have the power required for the
    job while maintaining understandability, the
    feeling of control, and the pleasure of
    accomplishment.
                                      -Donald Norman
http://www.flickr.com/photos/mattharvey1/5712604622/
Agenda
•   Recap Previous Edition
•   API Modeling
•   Security
•   Message Design
•   Hypermedia
•   Transactions
http://offers.apigee.com/web-api-design-ebook/
URL Design                                           Versioning
Plural nouns for    /dogs                            Include version in   /v1/dogs
collections                                          URL
ID for entity       /dogs/1234                       Keep one previous    /v1/dogs
                                                     version long         /v2/dogs
Associations        /owners/5678/dogs
                                                     enough for
                    POST GET PUT DELETE
                                                     developers to
4 HTTP
                                                     migrate
Methods
Bias toward         /dogs (not animals)
concrete names                                       Errors
Multiple            /dogs.json                       8 Status Codes       200 201 304 400 401 403 404 500
formats in URL      /dogs.xml
                                                     Verbose messages     {"msg": "verbose, plain language hints"}
Paginate with       ?limit=10&offset=0
limit and offset
Query params        ?color=red&state=running
                                                     Client Considerations
Partial selection   ?fields=name,state
                                                     Client does not      ?suppress_response_codes=true

Use medial          "createdAt": 1320296464          support HTTP
capitalization      myObject.createdAt;              status codes
                    /convert?from=EUR&to=CNY&amoun   Client does not      GET   /dogs?method=post
Use verbs for                                                             GET   /dogs
non-resource        t=100                            support HTTP
                                                                          GET   /dogs?method=put
requests                                             methods
                                                                          GET   /dogs?method=delete
Search              /search?q=happy%2Blabrador       Complement API       1. JavaScript
                                                     with SDK and code    2. …
DNS                 api.foo.com                                           3. …
                    developers.foo.com               libraries
How do we get started with our API?
Build an API Model




     http://www.flickr.com/photos/brent_nashville/2156695472/in/photostream/
Don’t Go Cowboy




 http://www.flickr.com/photos/theory/3364213389/in/photostream/
How do we secure our API?
Twitter Streaming API
Authorization: Basic aWhlYXJ0OmFwaXM=




Amazon Web Services API
Authorization: AWS
AKIAIOSFODNN7EXAMPLE:frJIUNo//yllqDzg=




Google API
Authorization: Bearer 1/fFBGRNJru1FQd44AzqT3Zg
OAuth2
Authorization: Bearer 1/fFBGRNJru1FQd44AzqT3Zg
How do approach message design?
Support multiple formats JSON and XML
Make JSON the default
How do we represent single items?
Twitter                                  Foursquare               Instagram
{                                        {                        {
  "created_at": "Thu Jan 10 08:44:59      "meta": {…},             "meta": {…},
+0000 2013",                              "notifications": […],    "data": {}
  "id": 289291736440791040,               "response": {}          }
  "id_str": "289291736440791040",        }
  "text": "@landlessness here's one
for you: 50-year plan to fix
Detroitnnhttp://t.co/kJ2l1FZv",
  "source": "<a
href="http://twitter.com/download/andr
oid" rel="nofollow">Twitter for
Android</a>",
  "truncated": false,
  "in_reply_to_status_id": null,
  "in_reply_to_status_id_str": null,
  "in_reply_to_user_id": 41020312,
  "in_reply_to_user_id_str":
"41020312",
  "in_reply_to_screen_name":
"landlessness",
  "user": {…},
  "geo": {…},
  "coordinates": {…},
  "place": {…},
  "contributors”:{…},
  "retweet_count": 0,
  "entities": {…},
  "favorited": false,
  "retweeted": false,
  "possibly_sensitive": false
}




                                                                                  21
Twitter                                  Foursquare                              Instagram
{                                        {                                       {
  "created_at": "Thu Jan 10 08:44:59      "meta": {…},                            "meta": {…},
+0000 2013",                              "notifications": […],                   "data": {
  "id": 289291736440791040,               "response": {                             "attribution": {…},
  "id_str": "289291736440791040",           "checkin": {                            "type": "image",
  "text": "@landlessness here's one          "id": "50eeff78e4b0f8e9624ea5f8",      "location": {…},
for you: 50-year plan to fix                 "createdAt": 1357840248,               "comments": {…},
Detroitnnhttp://t.co/kJ2l1FZv",            "type": "checkin",                     "filter": "Sierra",
  "source": "<a                              "shout": "Pharmacy #DRUGS!!!           "created_time": "1357826573",
href="http://twitter.com/download/andr   #ToothPulled :(",                          "link":
oid" rel="nofollow">Twitter for              "timeZone": "America/Detroit",      "http://instagr.am/p/UTk5Xut3gN/",
Android</a>",                                "timeZoneOffset": -300,                "likes": {…},
  "truncated": false,                        "user": {…},                           "images": {…},
  "in_reply_to_status_id": null,             "venue": {…},                          "caption": {…},
  "in_reply_to_status_id_str": null,         "source": {…}                          "user_has_liked": false,
  "in_reply_to_user_id": 41020312,          }                                       "id": "365798266911553549_3573549",
  "in_reply_to_user_id_str":              }                                          "user": {…}
"41020312",                              }                                        }
  "in_reply_to_screen_name":                                                     }
"landlessness",
  "user": {…},
  "geo": {…},
  "coordinates": {…},
  "place": {…},
  "contributors”:{…},
  "retweet_count": 0,
  "entities": {…},
  "favorited": false,
  "retweeted": false,
  "possibly_sensitive": false
}




                                                                                                                 22
Take the best of Foursquare and Instagram
{
 "meta": {…},
 "dog": {…}
 "notifications": […],
}




                                            23
How do we represent collections?
Twitter                                  Foursquare                                Instagram
[                                        {                                         {
 {                                        "meta": {…},                              "meta": {…},
  "created_at": "Thu Jan 10 08:44:59      "notifications": […],                     "data": [
+0000 2013",                              "response": {                               {
  "id": 289291736440791040,                 "recent": [                                "attribution": {…},
  "id_str": "289291736440791040",            {                                         "type": "image",
  "text": "@landlessness here's one            "id": "50eeff78e4b0f8e9624ea5f8",       "location": {…},
for you: 50-year plan to fix                   "createdAt": 1357840248,                "comments": {…},
Detroitnnhttp://t.co/kJ2l1FZv",              "type": "checkin",                      "filter": "Sierra",
  "source": "<a                                "shout": "Pharmacy #DRUGS!!!            "created_time": "1357826573",
href="http://twitter.com/download/andr   #ToothPulled :(",                             "link":
oid" rel="nofollow">Twitter for                "timeZone": "America/Detroit",      "http://instagr.am/p/UTk5Xut3gN/",
Android</a>",                                  "timeZoneOffset": -300,                 "likes": {…},
  "truncated": false,                          "user": {…},                            "images": {…},
  "in_reply_to_status_id": null,               "venue": {…}                            "caption": {…},
  "in_reply_to_status_id_str": null,         },                                        "user_has_liked": false,
  "in_reply_to_user_id": 41020312,           {…},                                      "id": "365798266911553549_3573549",
  "in_reply_to_user_id_str":                 {…},                                       "user": {…}
"41020312",                                 ]                                          },
  "in_reply_to_screen_name":              }                                            {…},
"landlessness",                          }                                             {…}
  "user": {…},                                                                        ]
  "geo": {…},                                                                       }
  "coordinates": {…},                                                              }
  "place": {…},
  "contributors”:{…},
  "retweet_count": 0,
  "entities": {…},
  "favorited": false,
  "retweeted": false,
  "possibly_sensitive": false
 },
 {…},
 {…}
]



                                                                                                                   25
Take the best of Foursquare and Instagram
{
 "meta": {…},
 "dogs": {…} /* include same info as single */
 "notifications": […],
}




                                                 26
How do we represent search results?
“   Selecting results is not the same as searching.
                                          -Facebook API
Bing Search                                        Google Custom Search                               Reddit Search
{                                                  {                                                  {
 "SearchResponse": {                                "kind": "customsearch#search",                    "kind": "Listing",
   "Version": "2.2",                                "url": {                                          "data": {
    "Query": {                                       "type": "application/json",                       "after": "t3_qy342",
    "SearchTerms": "sushi"                           "template":                                       "before": null,
   },                                              "https://www.googleapis.com/customsearch/v1?q={s    "children": [
   "Web": {                                        earchTerms}…},                                        {
    "Total": 95200000,                              "queries": {                                          "data": {
    "Offset": 0,                                     "request": [                                           "id": "f605o",
    "Results": [                                      {                                                     "num_comments": 943,
      {                                                 "title": "Google Custom Search - sushi",            "score": 1146,
       "Title": "The Sushi FAQ - The ultimate           "totalResults": "15000000",                         "ups": 3110,
guide to sushi and sashimi and how to ...",             "searchTerms": "sushi",                             "downs": 1964,
       "Description": "What is sushi?..",               "count": 10,                                        "created": 1295553753.0,
       "Url": "http://www.sushifaq.com/",               "startIndex": 1,                                    "url":
       "CacheUrl":                                    }                                               "http://www.reddit.com/r/AskReddit/comments/f605
"http://cc.bingj.com/cache.aspx?q=sushi&d=485519     ]                                                o/this_is_a_long_shot_any_sushi_chefs_need_a_job
0808495712&w=yU8fJS-YPT-f4svREMW2xSa75OoBUAZR",     },                                                _in/",
       "DisplayUrl": "www.sushifaq.com",            "context": {                                            "author": "jining",
       "DateTime": "2013-01-08T15:12:00Z"            "title": "Custom Search"                             }
      },                                            },                                                   },
      {                                             "searchInformation": {                               {
       "Title": "What Is Sushi? - Sushi Guide -      "searchTime": 0.314942,                              "data": {
Eatsushi.com",                                       "formattedSearchTime": "0.31",                         "id": "c9eng”,
       "Description": "Eatsushi.com...",             "totalResults": "15000000",                            "num_comments": 308,
       "Url":                                        "formattedTotalResults": "15,000,000"                  "score": 59,
"http://www.eatsushi.com/whatsushi.asp",            },                                                      "ups": 128,
       "CacheUrl":                                  "items": [                                              "downs": 69,
"http://cc.bingj.com/cache.aspx?q=sushi&d=501324     {                                                      "created": 1275155900.0,
9854931333&w=ihBzI9k9WbrnwxKcV3n8mOoV97M89K-b",       "kind": "customsearch#result",                        "url":
       "DisplayUrl":                                  "title": "Standardized Usage Statistics         "http://www.reddit.com/r/IAmA/comments/c9eng/i_a
"www.eatsushi.com/whatsushi.asp",                  Harvesting Initiative (SUSHI ... - NISO",          m_a_sushi_man_ama/",
       "DateTime": "2013-01-07T13:51:00Z"             "htmlTitle": "u003cbu003eStandardized Usage   "saved": false, "is_self": true, "permalink":
      }                                            Statistics Harvesting Initiativeu003c/bu003e     "/r/IAmA/comments/c9eng/i_am_a_sushi_man_ama/",
    ]                                              (u003cbu003eSUSHIu003c/bu003e                        "author": "IAmASushiMan”
   }                                               u003cbu003e...u003c/bu003e - NISO",                  }
 }                                                    "link":                                             }
}                                                  "http://www.niso.org/workrooms/sushi",                ]
                                                      "displayLink": "www.niso.org",                   }
                                                      "snippet": "The Standardized Usage Statistics   }
                                                   Harvesting Initiative (SUSHI) Protocol
                                                   standard (ANSI/NISO Z39.93-2007) defines an
                                                   automated request and response    model ...”,




                                                                                                                                             29
(Mostly) Follow Google Custom Search
{
 "meta": {
    "limit": 1,
    "offset": 10,
    "totalResults": 15000000,
    "query": "sushi",
    "searchTime": 0.314942
 },
 "results": [
   {},
   {},
   {}
 ]
}



                                       30
How do we represent links?
Netflix API
<link
  href=“http://api-public.netflix.com/catalog/people/100637”
  rel=“http://schemas.netflix.com/catalog/person.actor”
  title="Elijah Wood”
></link>



GitHub API

"organization": {
  "login": "octocat",
  "id": 1,
  "url": "https://api.github.com/users/octocat",
  "type": "Organization”
}
Follow Netflix and the Web Linking spec
<link
  href=“http://api-public.netflix.com/catalog/people/100637”
  rel=“http://schemas.netflix.com/catalog/person.actor”
  title="Elijah Wood”
></link>
How do we represent actions?
GitHub




Form-based API
”actions": [{
  “name”: “edit-repo”,
  “method”: “PATCH”,
  “href”: “https://api.github.com/repos/kevinswiber/siren”,
  ”fields”: [ { “name”: “name”, “type”: “text” },
    { “name”: “description”, “type”: “text” }
}]
Form-based API
"actions": [{
  "name": "edit-repo",
  “method”: “PATCH”,
  “href”: “https://api.github.com/repos/kevinswiber/siren”,
  ”fields”: [ { “name”: “name”, “type”: “text” },
    { “name”: “description”, “type”: “text” }
}]
How do we represent metadata?
Flickr API (inline)
<item
  type="photo”
  id="10289”
  server="2”
  views="47”
  faves="0”
  more="0">


Dropbox API (/metadata)
{
    "size": "225.4KB”,
    "rev": "35e97029684fe”,
    "bytes": 230783,
    "modified": "Tue, 19 Jul 2011 21:55:38 +0000”,
    "path": "/Getting_Started.pdf”,
    "is_dir": false,
    "icon": "page_white_acrobat”,
    "root": "dropbox”,
    "mime_type": "application/pdf”,
    "revision": 220823
}
Include a metadata in responses and consider a dedicated
/meta resource
{
 "meta": {
   "size": "225.4KB”,
   "rev": "35e97029684fe”,
   "bytes": 230783,
   "modified": "Tue, 19 Jul 2011 21:55:38 +0000”,
   "path": "/Getting_Started.pdf”,
   "is_dir": false,
   "icon": "page_white_acrobat”,
   "root": "dropbox”,
   "mime_type": "application/pdf”,
   "revision": 220823
 }
}

                                                           39
What can we learn from hypermedia types?
Atom/AtomPub
<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>My New Collection</title>
  <id>urn:uuid:de46e3a1-e489-41a6-88a6-21e7f0e8e2d8</id>
  <updated>2009-06-12T12:13:46Z</updated>
  <author>
    <name>Daffy</name>
  </author>
  <summary type="text" />
  <content type="application/atom+xml;type=feed"
    src="http://example.org/my-new-collection"/>
  <link rel="edit”
    href="http://example.org/my-new-collection.atom" />
</entry>
XHTML
<ul class=“search user-list”>
  <li class=“user”>
    <div class="avatar">
      <a href="/users/@kevin">
        <img class=”user-image" src=”/img/avatar.png" />
      </a>
    </div>
    <div>
      <a href=“/users/@kevin” rel=“user messages”>
        <span class=“user-name”>@kevin</span>
        (<span class="user-text">@kevin</span>)
      </a>
    </div>
  </li>
</ul>
HAL

{
    “currentlyProcessing”: 14
    “shippedToday”: 20,
    “_links”: {
      “self”: { “href”: “/orders?page=2” },
      “next”: { “href”: “/orders?page=3” },
      “prev”: { “href”: “/orders?page=1” }
    }
}
Collection+JSON
{ “collection”:
  {
    “version”: “1.0”,
    “href”: “http://example.org/friends”,
    “items”: [
       “href”: “http://example.org/friends/kevin”,
       “data”: [
         {“name”: “full-name”, “value”: “Kevin Swiber” }
       ]
    ],
    “queries”: [
       {“rel”: “search”, “href”: “./search”, “data”: [
         {“name”: “search”, “value”: “” }
    ]
  }
}
Siren
{
    “class”: [“owner”, “vip”],
    “properties”: {
       “name”: “Kevin”
    },
    “entities”: [
       {
         “rel”: [“https://rels.x.io/dog”],
         “href”: “https://api.x.io/dogs/1”
       }
    ],
    “actions”: [
       {
          “name”: “adopt”,
          “method”: “POST”,
          “href”: “https://api.x.io/owners/1/dogs”,
          “fields”: [ { “name”: “dog-name”, “type”: “text” } ]
       }
    ],
    “links”: [
       { “rel”: [“self”], “href”: “https://api.x.io/owners/1” }
    ]
}
How do we accept binary data?
multipart/form-data
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name=“caption”

Cool picture of my cat.
--AaB03x
Content-Disposition: form-data; name=“photo”; filename=“catpajamas.jpg”
Content-Type: image/jpeg
Content-Transfer-Encoding: binary

…contents of catpajamas.jpg…
--AaB03x
Inline Base64 Encoding
POST /photos
{
  “caption”: “Cool picture of my cat.”
  “photo”: “RHVkZSwgbXkgY2F0IGhhcyB0aGUgYmVzdCBwYWphbWFzLg==”
}
2-Step Process
POST /photos
{
  “caption”: “Cool picture of my cat.”
}


PUT /photos/1234/data
Content-Type: image/jpeg
Content-Length: 240
Content-Transfer-Encoding: binary

…binary content…
Opt for multipart/form-data.
Be consistent.
How do we support caching?
Expiration

200 OK
Cache-Control: private, max-age=2592000
ETags


GET /dogs/1
ETag: “a7D92kda94aisdfG”


GET /dogs/1
If-None-Match: “a7D92kda94aisdfG”
Last-Modified


GET /dogs/1
Last-Modified: Thu, 10 Jan 2013 19:43:31 GMT


GET /dogs/1
If-Modified-Since: Thu, 10 Jan 2013 19:43:31 GMT
Think about the client.
Do we need a JavaScript API?
Yes. Follow LinkedIn’s lead.
What about posting data?
application/x-www-form-urlencoded



 breed=Dachshund&name=Hotdog&age=2
application/xml


<dog>
 <breed>Dachshund</breed>
 <name>Hotdog</name>
 <age>2</age>
</dog>
application/json


 {
     “breed”: “Dachshund”,
     “name”: “Hotdog”,
     “age”: 2
 }
Favor application/x-www-form-urlencoded data.
How do we handle transactions?
Create a Transaction
POST /carts
…
201 Created
Location: /carts/1
Add Items
POST /carts/1/items/
{ “productId”: “mittens123”, “quantity”: 1 }
…
201 Created
Location: /cartItems/1234
Commit the Transaction
POST /carts/1
{ “message”: “checkout” }
…
200 OK
Summary
•   Checkout previous editions for URI design
•   Start with API modeling
•   Use OAuth for security
•   Good message design is for developers
•   Learn from hypermedia specs
•   More on transactions later
Questions?
THANK YOU
Subscribe to API webinars at:
youtube.com/apigee
THANK YOU
Questions and ideas to:
groups.google.com/group/api-craft
THANK YOU
Contact us at:

@landlessness
brian@apigee.com

@kevinswiber
kswiber@apigee.com

@apigee
1 of 71

Recommended

RESTful API Design, Second Edition by
RESTful API Design, Second EditionRESTful API Design, Second Edition
RESTful API Design, Second EditionApigee | Google Cloud
180.1K views106 slides
RESTful API - Best Practices by
RESTful API - Best PracticesRESTful API - Best Practices
RESTful API - Best PracticesTricode (part of Dept)
2.6K views20 slides
Pragmatic RESTful API Design: Apigee Webinar by
Pragmatic RESTful API Design: Apigee WebinarPragmatic RESTful API Design: Apigee Webinar
Pragmatic RESTful API Design: Apigee WebinarApigee | Google Cloud
81.3K views73 slides
RESTful Web アプリの設計レビューの話 by
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
72.2K views29 slides
RESTful API 入門 by
RESTful API 入門RESTful API 入門
RESTful API 入門Keisuke Nishitani
13.6K views16 slides
Web API: The Good Parts 落穂ひろい by
Web API: The Good Parts 落穂ひろいWeb API: The Good Parts 落穂ひろい
Web API: The Good Parts 落穂ひろいAPI Meetup
17.3K views31 slides

More Related Content

What's hot

Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方 by
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方kwatch
4.8K views20 slides
Design Beautiful REST + JSON APIs by
Design Beautiful REST + JSON APIsDesign Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIsStormpath
226K views85 slides
Building a Microservices-based ERP System by
Building a Microservices-based ERP SystemBuilding a Microservices-based ERP System
Building a Microservices-based ERP SystemMongoDB
12.2K views44 slides
Postman Collection Format v2.0 (pre-draft) by
Postman Collection Format v2.0 (pre-draft)Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)Postman
208.5K views44 slides
Best practices for RESTful web service design by
Best practices for RESTful web service designBest practices for RESTful web service design
Best practices for RESTful web service designRamin Orujov
29.9K views33 slides
API-first development by
API-first developmentAPI-first development
API-first developmentVasco Veloso
165 views25 slides

What's hot(20)

Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方 by kwatch
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
kwatch4.8K views
Design Beautiful REST + JSON APIs by Stormpath
Design Beautiful REST + JSON APIsDesign Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIs
Stormpath226K views
Building a Microservices-based ERP System by MongoDB
Building a Microservices-based ERP SystemBuilding a Microservices-based ERP System
Building a Microservices-based ERP System
MongoDB12.2K views
Postman Collection Format v2.0 (pre-draft) by Postman
Postman Collection Format v2.0 (pre-draft)Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)
Postman208.5K views
Best practices for RESTful web service design by Ramin Orujov
Best practices for RESTful web service designBest practices for RESTful web service design
Best practices for RESTful web service design
Ramin Orujov29.9K views
API-first development by Vasco Veloso
API-first developmentAPI-first development
API-first development
Vasco Veloso165 views
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes by Jiyeon Seo
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
Jiyeon Seo1.6K views
마이크로 서비스 아키텍쳐 소개 및 구현 방법 by Young Soo Lee
마이크로 서비스 아키텍쳐 소개 및 구현 방법마이크로 서비스 아키텍쳐 소개 및 구현 방법
마이크로 서비스 아키텍쳐 소개 및 구현 방법
Young Soo Lee6.7K views
Regular Expression Injection by NSConclave
Regular Expression InjectionRegular Expression Injection
Regular Expression Injection
NSConclave718 views
Swagger With REST APIs.pptx.pdf by Knoldus Inc.
Swagger With REST APIs.pptx.pdfSwagger With REST APIs.pptx.pdf
Swagger With REST APIs.pptx.pdf
Knoldus Inc.337 views
FOXX - a Javascript application framework on top of ArangoDB by ArangoDB Database
FOXX - a Javascript application framework on top of ArangoDBFOXX - a Javascript application framework on top of ArangoDB
FOXX - a Javascript application framework on top of ArangoDB
ArangoDB Database35.8K views
Oracle APEX Social Login by msewtz
Oracle APEX Social LoginOracle APEX Social Login
Oracle APEX Social Login
msewtz6.8K views
Rest api standards and best practices by Ankita Mahajan
Rest api standards and best practicesRest api standards and best practices
Rest api standards and best practices
Ankita Mahajan7.3K views
Attacking thru HTTP Host header by Sergey Belov
Attacking thru HTTP Host headerAttacking thru HTTP Host header
Attacking thru HTTP Host header
Sergey Belov1.8K views
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか by Hiroshi Tokumaru
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
Hiroshi Tokumaru74.4K views
Reasons To Automate API Testing Process by QASource
Reasons To Automate API Testing ProcessReasons To Automate API Testing Process
Reasons To Automate API Testing Process
QASource979 views

Viewers also liked

Microservices Done Right: Key Ingredients for Microservices Success by
Microservices Done Right: Key Ingredients for Microservices SuccessMicroservices Done Right: Key Ingredients for Microservices Success
Microservices Done Right: Key Ingredients for Microservices SuccessApigee | Google Cloud
12.8K views22 slides
Pump api 675 presentation by
Pump api 675 presentationPump api 675 presentation
Pump api 675 presentationVothanh Trung
19.7K views42 slides
Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스 by
Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스
Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스Minkyu Cho
24.2K views18 slides
What Makes a Great Open API? by
What Makes a Great Open API?What Makes a Great Open API?
What Makes a Great Open API?John Musser
91.1K views72 slides
Golden Rules of API Design by
Golden Rules of API DesignGolden Rules of API Design
Golden Rules of API DesignDavid Koelle
2K views33 slides
Python Deployment with Fabric by
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabricandymccurdy
34K views30 slides

Viewers also liked(20)

Microservices Done Right: Key Ingredients for Microservices Success by Apigee | Google Cloud
Microservices Done Right: Key Ingredients for Microservices SuccessMicroservices Done Right: Key Ingredients for Microservices Success
Microservices Done Right: Key Ingredients for Microservices Success
Apigee | Google Cloud12.8K views
Pump api 675 presentation by Vothanh Trung
Pump api 675 presentationPump api 675 presentation
Pump api 675 presentation
Vothanh Trung19.7K views
Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스 by Minkyu Cho
Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스
Apache Mahout 맛보기 - 30분만에 추천시스템 만들기 for 네이버 TV 서비스
Minkyu Cho24.2K views
What Makes a Great Open API? by John Musser
What Makes a Great Open API?What Makes a Great Open API?
What Makes a Great Open API?
John Musser91.1K views
Golden Rules of API Design by David Koelle
Golden Rules of API DesignGolden Rules of API Design
Golden Rules of API Design
David Koelle2K views
Python Deployment with Fabric by andymccurdy
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabric
andymccurdy34K views
logback 세미나 발표자료 by JungGeun Lee
logback 세미나 발표자료logback 세미나 발표자료
logback 세미나 발표자료
JungGeun Lee13.2K views
Economic Models for Reinventing Telco - Innovation with APIs by Apigee | Google Cloud
Economic Models for Reinventing Telco - Innovation with APIsEconomic Models for Reinventing Telco - Innovation with APIs
Economic Models for Reinventing Telco - Innovation with APIs
API Product Management - Driving Success through the Value Chain by Apigee | Google Cloud
API Product Management - Driving Success through the Value ChainAPI Product Management - Driving Success through the Value Chain
API Product Management - Driving Success through the Value Chain
How To Design A Good A P I And Why It Matters G O O G L E by guestbe92f4
How To Design A Good  A P I And Why It Matters    G O O G L EHow To Design A Good  A P I And Why It Matters    G O O G L E
How To Design A Good A P I And Why It Matters G O O G L E
guestbe92f431.6K views
The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs by Apigee | Google Cloud
The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIsThe Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs
The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs
Crafting APIs for Mobile Apps - Everything You Need to Know by Apigee | Google Cloud
Crafting APIs for Mobile Apps - Everything You Need to KnowCrafting APIs for Mobile Apps - Everything You Need to Know
Crafting APIs for Mobile Apps - Everything You Need to Know
Essential API Facade Patterns: One Phase to Two Phase Conversion (Episode 3) by Apigee | Google Cloud
Essential API Facade Patterns: One Phase to Two Phase Conversion (Episode 3)Essential API Facade Patterns: One Phase to Two Phase Conversion (Episode 3)
Essential API Facade Patterns: One Phase to Two Phase Conversion (Episode 3)
Essential API Facade Patterns: Synchronous to Asynchronous Conversion (Episod... by Apigee | Google Cloud
Essential API Facade Patterns: Synchronous to Asynchronous Conversion (Episod...Essential API Facade Patterns: Synchronous to Asynchronous Conversion (Episod...
Essential API Facade Patterns: Synchronous to Asynchronous Conversion (Episod...

Similar to API Design - 3rd Edition

HackMIT Presentation by
HackMIT PresentationHackMIT Presentation
HackMIT PresentationMatt Harris
1.4K views50 slides
Data exchange formats by
Data exchange formatsData exchange formats
Data exchange formatsPrzemysław Kamiński
707 views69 slides
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana" by
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"South Tyrol Free Software Conference
390 views31 slides
Social media mashup website's by
Social media mashup website'sSocial media mashup website's
Social media mashup website'sMathias Vissers
578 views33 slides
Practical MongoDB by
Practical MongoDBPractical MongoDB
Practical MongoDBWill Button
757 views43 slides
Montreal Elasticsearch Meetup by
Montreal Elasticsearch MeetupMontreal Elasticsearch Meetup
Montreal Elasticsearch MeetupLoïc Bertron
2.1K views94 slides

Similar to API Design - 3rd Edition(20)

HackMIT Presentation by Matt Harris
HackMIT PresentationHackMIT Presentation
HackMIT Presentation
Matt Harris1.4K views
Practical MongoDB by Will Button
Practical MongoDBPractical MongoDB
Practical MongoDB
Will Button757 views
Montreal Elasticsearch Meetup by Loïc Bertron
Montreal Elasticsearch MeetupMontreal Elasticsearch Meetup
Montreal Elasticsearch Meetup
Loïc Bertron2.1K views
Automatic discovery of Web API Specifications: an example-driven approach by Jordi Cabot
Automatic discovery of Web API Specifications: an example-driven approachAutomatic discovery of Web API Specifications: an example-driven approach
Automatic discovery of Web API Specifications: an example-driven approach
Jordi Cabot543 views
Example-driven Web API Specification Discovery by Javier Canovas
Example-driven Web API Specification DiscoveryExample-driven Web API Specification Discovery
Example-driven Web API Specification Discovery
Javier Canovas12.6K views
The Flash Facebook Cookbook - FlashMidlands by James Ford
The Flash Facebook Cookbook - FlashMidlandsThe Flash Facebook Cookbook - FlashMidlands
The Flash Facebook Cookbook - FlashMidlands
James Ford7.7K views
HackMIT Lightning Talk by Matt Harris
HackMIT Lightning TalkHackMIT Lightning Talk
HackMIT Lightning Talk
Matt Harris1.8K views
Intro to developing for @twitterapi (updated) by Raffi Krikorian
Intro to developing for @twitterapi (updated)Intro to developing for @twitterapi (updated)
Intro to developing for @twitterapi (updated)
Raffi Krikorian2.6K views
ELK Stack - Turn boring logfiles into sexy dashboard by Georg Sorst
ELK Stack - Turn boring logfiles into sexy dashboardELK Stack - Turn boring logfiles into sexy dashboard
ELK Stack - Turn boring logfiles into sexy dashboard
Georg Sorst5.4K views
Elasticmeetup curiosity 20141113 by Erwan Pigneul
Elasticmeetup curiosity 20141113Elasticmeetup curiosity 20141113
Elasticmeetup curiosity 20141113
Erwan Pigneul650 views
Curiosity, outil de recherche open source par PagesJaunes by PagesJaunes
Curiosity, outil de recherche open source par PagesJaunesCuriosity, outil de recherche open source par PagesJaunes
Curiosity, outil de recherche open source par PagesJaunes
PagesJaunes1.1K views
NoSQL & MongoDB by Shuai Liu
NoSQL & MongoDBNoSQL & MongoDB
NoSQL & MongoDB
Shuai Liu1.7K views
Beautiful REST+JSON APIs with Ion by Stormpath
Beautiful REST+JSON APIs with IonBeautiful REST+JSON APIs with Ion
Beautiful REST+JSON APIs with Ion
Stormpath3.7K views
Unleashing twitter data for fun and insight by Digital Reasoning
Unleashing twitter data for fun and insightUnleashing twitter data for fun and insight
Unleashing twitter data for fun and insight
Digital Reasoning1.3K views

More from Apigee | Google Cloud

How Secure Are Your APIs? by
How Secure Are Your APIs?How Secure Are Your APIs?
How Secure Are Your APIs?Apigee | Google Cloud
17.3K views19 slides
Magazine Luiza at a glance (1) by
Magazine Luiza at a glance (1)Magazine Luiza at a glance (1)
Magazine Luiza at a glance (1)Apigee | Google Cloud
2.9K views6 slides
Monetization: Unlock More Value from Your APIs by
Monetization: Unlock More Value from Your APIs Monetization: Unlock More Value from Your APIs
Monetization: Unlock More Value from Your APIs Apigee | Google Cloud
11.9K views27 slides
Apigee Demo: API Platform Overview by
Apigee Demo: API Platform OverviewApigee Demo: API Platform Overview
Apigee Demo: API Platform OverviewApigee | Google Cloud
14.1K views19 slides
Ticketmaster at a glance by
Ticketmaster at a glanceTicketmaster at a glance
Ticketmaster at a glanceApigee | Google Cloud
2K views5 slides
AccuWeather: Recasting API Experiences in a Developer-First World by
AccuWeather: Recasting API Experiences in a Developer-First WorldAccuWeather: Recasting API Experiences in a Developer-First World
AccuWeather: Recasting API Experiences in a Developer-First WorldApigee | Google Cloud
3.7K views19 slides

More from Apigee | Google Cloud(20)

AccuWeather: Recasting API Experiences in a Developer-First World by Apigee | Google Cloud
AccuWeather: Recasting API Experiences in a Developer-First WorldAccuWeather: Recasting API Experiences in a Developer-First World
AccuWeather: Recasting API Experiences in a Developer-First World
The Four Transformative Forces of the API Management Market by Apigee | Google Cloud
The Four Transformative Forces of the API Management MarketThe Four Transformative Forces of the API Management Market
The Four Transformative Forces of the API Management Market
Managing the Complexity of Microservices Deployments by Apigee | Google Cloud
Managing the Complexity of Microservices DeploymentsManaging the Complexity of Microservices Deployments
Managing the Complexity of Microservices Deployments
Apigee | Google Cloud11.4K views

Recently uploaded

Network Source of Truth and Infrastructure as Code revisited by
Network Source of Truth and Infrastructure as Code revisitedNetwork Source of Truth and Infrastructure as Code revisited
Network Source of Truth and Infrastructure as Code revisitedNetwork Automation Forum
52 views45 slides
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...ShapeBlue
98 views29 slides
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...ShapeBlue
138 views18 slides
NTGapps NTG LowCode Platform by
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform Mustafa Kuğu
365 views30 slides
The Power of Heat Decarbonisation Plans in the Built Environment by
The Power of Heat Decarbonisation Plans in the Built EnvironmentThe Power of Heat Decarbonisation Plans in the Built Environment
The Power of Heat Decarbonisation Plans in the Built EnvironmentIES VE
69 views20 slides
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool by
Extending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPoolExtending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPool
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPoolShapeBlue
84 views10 slides

Recently uploaded(20)

DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by ShapeBlue
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
ShapeBlue98 views
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by ShapeBlue
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
ShapeBlue138 views
NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu365 views
The Power of Heat Decarbonisation Plans in the Built Environment by IES VE
The Power of Heat Decarbonisation Plans in the Built EnvironmentThe Power of Heat Decarbonisation Plans in the Built Environment
The Power of Heat Decarbonisation Plans in the Built Environment
IES VE69 views
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool by ShapeBlue
Extending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPoolExtending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPool
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool
ShapeBlue84 views
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ... by ShapeBlue
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
Import Export Virtual Machine for KVM Hypervisor - Ayush Pandey - University ...
ShapeBlue79 views
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ... by ShapeBlue
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
ShapeBlue123 views
Igniting Next Level Productivity with AI-Infused Data Integration Workflows by Safe Software
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Safe Software385 views
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by ShapeBlue
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
ShapeBlue120 views
State of the Union - Rohit Yadav - Apache CloudStack by ShapeBlue
State of the Union - Rohit Yadav - Apache CloudStackState of the Union - Rohit Yadav - Apache CloudStack
State of the Union - Rohit Yadav - Apache CloudStack
ShapeBlue253 views
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
ShapeBlue176 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue85 views
The Role of Patterns in the Era of Large Language Models by Yunyao Li
The Role of Patterns in the Era of Large Language ModelsThe Role of Patterns in the Era of Large Language Models
The Role of Patterns in the Era of Large Language Models
Yunyao Li80 views
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by ShapeBlue
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
ShapeBlue117 views
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or... by ShapeBlue
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
ShapeBlue158 views
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue by ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
ShapeBlue103 views
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N... by James Anderson
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
James Anderson156 views

API Design - 3rd Edition

  • 1. API Design 3rd Edition Brian Mulloy @landlessness Kevin Swiber Apigee @kevinswiber @apigee
  • 5. @landlessness @kevinswiber
  • 6. The real issue is about design: designing things that have the power required for the job while maintaining understandability, the feeling of control, and the pleasure of accomplishment. -Donald Norman
  • 8. Agenda • Recap Previous Edition • API Modeling • Security • Message Design • Hypermedia • Transactions
  • 10. URL Design Versioning Plural nouns for /dogs Include version in /v1/dogs collections URL ID for entity /dogs/1234 Keep one previous /v1/dogs version long /v2/dogs Associations /owners/5678/dogs enough for POST GET PUT DELETE developers to 4 HTTP migrate Methods Bias toward /dogs (not animals) concrete names Errors Multiple /dogs.json 8 Status Codes 200 201 304 400 401 403 404 500 formats in URL /dogs.xml Verbose messages {"msg": "verbose, plain language hints"} Paginate with ?limit=10&offset=0 limit and offset Query params ?color=red&state=running Client Considerations Partial selection ?fields=name,state Client does not ?suppress_response_codes=true Use medial "createdAt": 1320296464 support HTTP capitalization myObject.createdAt; status codes /convert?from=EUR&to=CNY&amoun Client does not GET /dogs?method=post Use verbs for GET /dogs non-resource t=100 support HTTP GET /dogs?method=put requests methods GET /dogs?method=delete Search /search?q=happy%2Blabrador Complement API 1. JavaScript with SDK and code 2. … DNS api.foo.com 3. … developers.foo.com libraries
  • 11. How do we get started with our API?
  • 12. Build an API Model http://www.flickr.com/photos/brent_nashville/2156695472/in/photostream/
  • 13. Don’t Go Cowboy http://www.flickr.com/photos/theory/3364213389/in/photostream/
  • 14. How do we secure our API?
  • 15. Twitter Streaming API Authorization: Basic aWhlYXJ0OmFwaXM= Amazon Web Services API Authorization: AWS AKIAIOSFODNN7EXAMPLE:frJIUNo//yllqDzg= Google API Authorization: Bearer 1/fFBGRNJru1FQd44AzqT3Zg
  • 17. How do approach message design?
  • 18. Support multiple formats JSON and XML
  • 19. Make JSON the default
  • 20. How do we represent single items?
  • 21. Twitter Foursquare Instagram { { { "created_at": "Thu Jan 10 08:44:59 "meta": {…}, "meta": {…}, +0000 2013", "notifications": […], "data": {} "id": 289291736440791040, "response": {} } "id_str": "289291736440791040", } "text": "@landlessness here's one for you: 50-year plan to fix Detroitnnhttp://t.co/kJ2l1FZv", "source": "<a href="http://twitter.com/download/andr oid" rel="nofollow">Twitter for Android</a>", "truncated": false, "in_reply_to_status_id": null, "in_reply_to_status_id_str": null, "in_reply_to_user_id": 41020312, "in_reply_to_user_id_str": "41020312", "in_reply_to_screen_name": "landlessness", "user": {…}, "geo": {…}, "coordinates": {…}, "place": {…}, "contributors”:{…}, "retweet_count": 0, "entities": {…}, "favorited": false, "retweeted": false, "possibly_sensitive": false } 21
  • 22. Twitter Foursquare Instagram { { { "created_at": "Thu Jan 10 08:44:59 "meta": {…}, "meta": {…}, +0000 2013", "notifications": […], "data": { "id": 289291736440791040, "response": { "attribution": {…}, "id_str": "289291736440791040", "checkin": { "type": "image", "text": "@landlessness here's one "id": "50eeff78e4b0f8e9624ea5f8", "location": {…}, for you: 50-year plan to fix "createdAt": 1357840248, "comments": {…}, Detroitnnhttp://t.co/kJ2l1FZv", "type": "checkin", "filter": "Sierra", "source": "<a "shout": "Pharmacy #DRUGS!!! "created_time": "1357826573", href="http://twitter.com/download/andr #ToothPulled :(", "link": oid" rel="nofollow">Twitter for "timeZone": "America/Detroit", "http://instagr.am/p/UTk5Xut3gN/", Android</a>", "timeZoneOffset": -300, "likes": {…}, "truncated": false, "user": {…}, "images": {…}, "in_reply_to_status_id": null, "venue": {…}, "caption": {…}, "in_reply_to_status_id_str": null, "source": {…} "user_has_liked": false, "in_reply_to_user_id": 41020312, } "id": "365798266911553549_3573549", "in_reply_to_user_id_str": } "user": {…} "41020312", } } "in_reply_to_screen_name": } "landlessness", "user": {…}, "geo": {…}, "coordinates": {…}, "place": {…}, "contributors”:{…}, "retweet_count": 0, "entities": {…}, "favorited": false, "retweeted": false, "possibly_sensitive": false } 22
  • 23. Take the best of Foursquare and Instagram { "meta": {…}, "dog": {…} "notifications": […], } 23
  • 24. How do we represent collections?
  • 25. Twitter Foursquare Instagram [ { { { "meta": {…}, "meta": {…}, "created_at": "Thu Jan 10 08:44:59 "notifications": […], "data": [ +0000 2013", "response": { { "id": 289291736440791040, "recent": [ "attribution": {…}, "id_str": "289291736440791040", { "type": "image", "text": "@landlessness here's one "id": "50eeff78e4b0f8e9624ea5f8", "location": {…}, for you: 50-year plan to fix "createdAt": 1357840248, "comments": {…}, Detroitnnhttp://t.co/kJ2l1FZv", "type": "checkin", "filter": "Sierra", "source": "<a "shout": "Pharmacy #DRUGS!!! "created_time": "1357826573", href="http://twitter.com/download/andr #ToothPulled :(", "link": oid" rel="nofollow">Twitter for "timeZone": "America/Detroit", "http://instagr.am/p/UTk5Xut3gN/", Android</a>", "timeZoneOffset": -300, "likes": {…}, "truncated": false, "user": {…}, "images": {…}, "in_reply_to_status_id": null, "venue": {…} "caption": {…}, "in_reply_to_status_id_str": null, }, "user_has_liked": false, "in_reply_to_user_id": 41020312, {…}, "id": "365798266911553549_3573549", "in_reply_to_user_id_str": {…}, "user": {…} "41020312", ] }, "in_reply_to_screen_name": } {…}, "landlessness", } {…} "user": {…}, ] "geo": {…}, } "coordinates": {…}, } "place": {…}, "contributors”:{…}, "retweet_count": 0, "entities": {…}, "favorited": false, "retweeted": false, "possibly_sensitive": false }, {…}, {…} ] 25
  • 26. Take the best of Foursquare and Instagram { "meta": {…}, "dogs": {…} /* include same info as single */ "notifications": […], } 26
  • 27. How do we represent search results?
  • 28. Selecting results is not the same as searching. -Facebook API
  • 29. Bing Search Google Custom Search Reddit Search { { { "SearchResponse": { "kind": "customsearch#search", "kind": "Listing", "Version": "2.2", "url": { "data": { "Query": { "type": "application/json", "after": "t3_qy342", "SearchTerms": "sushi" "template": "before": null, }, "https://www.googleapis.com/customsearch/v1?q={s "children": [ "Web": { earchTerms}…}, { "Total": 95200000, "queries": { "data": { "Offset": 0, "request": [ "id": "f605o", "Results": [ { "num_comments": 943, { "title": "Google Custom Search - sushi", "score": 1146, "Title": "The Sushi FAQ - The ultimate "totalResults": "15000000", "ups": 3110, guide to sushi and sashimi and how to ...", "searchTerms": "sushi", "downs": 1964, "Description": "What is sushi?..", "count": 10, "created": 1295553753.0, "Url": "http://www.sushifaq.com/", "startIndex": 1, "url": "CacheUrl": } "http://www.reddit.com/r/AskReddit/comments/f605 "http://cc.bingj.com/cache.aspx?q=sushi&d=485519 ] o/this_is_a_long_shot_any_sushi_chefs_need_a_job 0808495712&w=yU8fJS-YPT-f4svREMW2xSa75OoBUAZR", }, _in/", "DisplayUrl": "www.sushifaq.com", "context": { "author": "jining", "DateTime": "2013-01-08T15:12:00Z" "title": "Custom Search" } }, }, }, { "searchInformation": { { "Title": "What Is Sushi? - Sushi Guide - "searchTime": 0.314942, "data": { Eatsushi.com", "formattedSearchTime": "0.31", "id": "c9eng”, "Description": "Eatsushi.com...", "totalResults": "15000000", "num_comments": 308, "Url": "formattedTotalResults": "15,000,000" "score": 59, "http://www.eatsushi.com/whatsushi.asp", }, "ups": 128, "CacheUrl": "items": [ "downs": 69, "http://cc.bingj.com/cache.aspx?q=sushi&d=501324 { "created": 1275155900.0, 9854931333&w=ihBzI9k9WbrnwxKcV3n8mOoV97M89K-b", "kind": "customsearch#result", "url": "DisplayUrl": "title": "Standardized Usage Statistics "http://www.reddit.com/r/IAmA/comments/c9eng/i_a "www.eatsushi.com/whatsushi.asp", Harvesting Initiative (SUSHI ... - NISO", m_a_sushi_man_ama/", "DateTime": "2013-01-07T13:51:00Z" "htmlTitle": "u003cbu003eStandardized Usage "saved": false, "is_self": true, "permalink": } Statistics Harvesting Initiativeu003c/bu003e "/r/IAmA/comments/c9eng/i_am_a_sushi_man_ama/", ] (u003cbu003eSUSHIu003c/bu003e "author": "IAmASushiMan” } u003cbu003e...u003c/bu003e - NISO", } } "link": } } "http://www.niso.org/workrooms/sushi", ] "displayLink": "www.niso.org", } "snippet": "The Standardized Usage Statistics } Harvesting Initiative (SUSHI) Protocol standard (ANSI/NISO Z39.93-2007) defines an automated request and response model ...”, 29
  • 30. (Mostly) Follow Google Custom Search { "meta": { "limit": 1, "offset": 10, "totalResults": 15000000, "query": "sushi", "searchTime": 0.314942 }, "results": [ {}, {}, {} ] } 30
  • 31. How do we represent links?
  • 32. Netflix API <link href=“http://api-public.netflix.com/catalog/people/100637” rel=“http://schemas.netflix.com/catalog/person.actor” title="Elijah Wood” ></link> GitHub API "organization": { "login": "octocat", "id": 1, "url": "https://api.github.com/users/octocat", "type": "Organization” }
  • 33. Follow Netflix and the Web Linking spec <link href=“http://api-public.netflix.com/catalog/people/100637” rel=“http://schemas.netflix.com/catalog/person.actor” title="Elijah Wood” ></link>
  • 34. How do we represent actions?
  • 35. GitHub Form-based API ”actions": [{ “name”: “edit-repo”, “method”: “PATCH”, “href”: “https://api.github.com/repos/kevinswiber/siren”, ”fields”: [ { “name”: “name”, “type”: “text” }, { “name”: “description”, “type”: “text” } }]
  • 36. Form-based API "actions": [{ "name": "edit-repo", “method”: “PATCH”, “href”: “https://api.github.com/repos/kevinswiber/siren”, ”fields”: [ { “name”: “name”, “type”: “text” }, { “name”: “description”, “type”: “text” } }]
  • 37. How do we represent metadata?
  • 38. Flickr API (inline) <item type="photo” id="10289” server="2” views="47” faves="0” more="0"> Dropbox API (/metadata) { "size": "225.4KB”, "rev": "35e97029684fe”, "bytes": 230783, "modified": "Tue, 19 Jul 2011 21:55:38 +0000”, "path": "/Getting_Started.pdf”, "is_dir": false, "icon": "page_white_acrobat”, "root": "dropbox”, "mime_type": "application/pdf”, "revision": 220823 }
  • 39. Include a metadata in responses and consider a dedicated /meta resource { "meta": { "size": "225.4KB”, "rev": "35e97029684fe”, "bytes": 230783, "modified": "Tue, 19 Jul 2011 21:55:38 +0000”, "path": "/Getting_Started.pdf”, "is_dir": false, "icon": "page_white_acrobat”, "root": "dropbox”, "mime_type": "application/pdf”, "revision": 220823 } } 39
  • 40. What can we learn from hypermedia types?
  • 41. Atom/AtomPub <?xml version="1.0"?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>My New Collection</title> <id>urn:uuid:de46e3a1-e489-41a6-88a6-21e7f0e8e2d8</id> <updated>2009-06-12T12:13:46Z</updated> <author> <name>Daffy</name> </author> <summary type="text" /> <content type="application/atom+xml;type=feed" src="http://example.org/my-new-collection"/> <link rel="edit” href="http://example.org/my-new-collection.atom" /> </entry>
  • 42. XHTML <ul class=“search user-list”> <li class=“user”> <div class="avatar"> <a href="/users/@kevin"> <img class=”user-image" src=”/img/avatar.png" /> </a> </div> <div> <a href=“/users/@kevin” rel=“user messages”> <span class=“user-name”>@kevin</span> (<span class="user-text">@kevin</span>) </a> </div> </li> </ul>
  • 43. HAL { “currentlyProcessing”: 14 “shippedToday”: 20, “_links”: { “self”: { “href”: “/orders?page=2” }, “next”: { “href”: “/orders?page=3” }, “prev”: { “href”: “/orders?page=1” } } }
  • 44. Collection+JSON { “collection”: { “version”: “1.0”, “href”: “http://example.org/friends”, “items”: [ “href”: “http://example.org/friends/kevin”, “data”: [ {“name”: “full-name”, “value”: “Kevin Swiber” } ] ], “queries”: [ {“rel”: “search”, “href”: “./search”, “data”: [ {“name”: “search”, “value”: “” } ] } }
  • 45. Siren { “class”: [“owner”, “vip”], “properties”: { “name”: “Kevin” }, “entities”: [ { “rel”: [“https://rels.x.io/dog”], “href”: “https://api.x.io/dogs/1” } ], “actions”: [ { “name”: “adopt”, “method”: “POST”, “href”: “https://api.x.io/owners/1/dogs”, “fields”: [ { “name”: “dog-name”, “type”: “text” } ] } ], “links”: [ { “rel”: [“self”], “href”: “https://api.x.io/owners/1” } ] }
  • 46. How do we accept binary data?
  • 47. multipart/form-data Content-Type: multipart/form-data; boundary=AaB03x --AaB03x Content-Disposition: form-data; name=“caption” Cool picture of my cat. --AaB03x Content-Disposition: form-data; name=“photo”; filename=“catpajamas.jpg” Content-Type: image/jpeg Content-Transfer-Encoding: binary …contents of catpajamas.jpg… --AaB03x
  • 48. Inline Base64 Encoding POST /photos { “caption”: “Cool picture of my cat.” “photo”: “RHVkZSwgbXkgY2F0IGhhcyB0aGUgYmVzdCBwYWphbWFzLg==” }
  • 49. 2-Step Process POST /photos { “caption”: “Cool picture of my cat.” } PUT /photos/1234/data Content-Type: image/jpeg Content-Length: 240 Content-Transfer-Encoding: binary …binary content…
  • 51. How do we support caching?
  • 53. ETags GET /dogs/1 ETag: “a7D92kda94aisdfG” GET /dogs/1 If-None-Match: “a7D92kda94aisdfG”
  • 54. Last-Modified GET /dogs/1 Last-Modified: Thu, 10 Jan 2013 19:43:31 GMT GET /dogs/1 If-Modified-Since: Thu, 10 Jan 2013 19:43:31 GMT
  • 55. Think about the client.
  • 56. Do we need a JavaScript API?
  • 61. application/json { “breed”: “Dachshund”, “name”: “Hotdog”, “age”: 2 }
  • 63. How do we handle transactions?
  • 64. Create a Transaction POST /carts … 201 Created Location: /carts/1
  • 65. Add Items POST /carts/1/items/ { “productId”: “mittens123”, “quantity”: 1 } … 201 Created Location: /cartItems/1234
  • 66. Commit the Transaction POST /carts/1 { “message”: “checkout” } … 200 OK
  • 67. Summary • Checkout previous editions for URI design • Start with API modeling • Use OAuth for security • Good message design is for developers • Learn from hypermedia specs • More on transactions later
  • 69. THANK YOU Subscribe to API webinars at: youtube.com/apigee
  • 70. THANK YOU Questions and ideas to: groups.google.com/group/api-craft
  • 71. THANK YOU Contact us at: @landlessness brian@apigee.com @kevinswiber kswiber@apigee.com @apigee

Editor's Notes

  1. Creative Commons Attribution-Share Alike 3.0 United States License
  2. “The argument is not between adding features and simplicity, between adding capability and usability. The real issue is about design: designing things that have the power required for the job while maintaining understandability, the feeling of control, and the pleasure of accomplishment.” – Donald Norman, “Simplicity Is Not The Answer”, ACM Interactions, volume 15, issue 5. “We are faced with an apparent paradox, but don&apos;t worry: good design will see us through. People want the extra power that increased features bring to a product, but they intensely dislike the complexity that results. Is this a paradox? Not necessarily. Complexity can be managed. “ – Donald Norman, “Simplicity Is Not the Answer”, ACM Interactions, volume 15, issue 5.
  3. http://www.flickr.com/photos/mattharvey1/5712604622/We’re building a cathedral. Though it is complex, it must be beautiful.
  4. What security measures can we put around our API?
  5. http://www.flickr.com/photos/brent_nashville/2156695472/in/photostream/Collaborate with all stakeholders: marketing, business analysts, software engineers, key business people, etc. This will be your API team.Develop a ubiquitous language, a glossary of terms that will appear in your API. This keeps everyone on the same page.Document a mental model of your API. (How you do this is up to you. See: UML)Iterate.
  6. http://www.flickr.com/photos/theory/3364213389/in/photostream/Freedom is fantastic until you hit the wall of reality. Your API represents your organization. Make sure your organization is present on key decisions.
  7. What security measures can we put around our API?
  8. Twitter uses HTTP Basic authentication. It has been around for a long time.Amazon Web Services chose to roll their own. This may have pre-dated the OAuth 1.0 specification.Google is using Bearer tokens with the OAuth 2.0 Framework specification.
  9. We like OAuth2. It’s a standard, which means anyone can read how it’s done. There are also good libraries out there to help build this for your API.OAuth2 allows developers to build clients that take advantage of user resources located on other services, such as Facebook, Google, and GitHub.A good alternative is using OAuth 1.0a. LinkedIn uses OAuth 1.0a for authorizing clients in their API, and it works very well.Keep an eye on stronger access token algorithms. OAuth2 MAC token support is still an Internet-Draft.
  10. What security measures can we put around our API?
  11. What security measures can we put around our API?
  12. What security measures can we put around our API?
  13. What security measures can we put around our API?
  14. What security measures can we put around our API?
  15. What security measures can we put around our API?
  16. What security measures can we put around our API?
  17. What security measures can we put around our API?
  18. What security measures can we put around our API?
  19. What security measures can we put around our API?
  20. What security measures can we put around our API?
  21. What security measures can we put around our API?
  22. What security measures can we put around our API?
  23. What security measures can we put around our API?
  24. Netflix uses Web Linking (RFC5899). Links have a relation value that may contain standard or custom relation types. An href is included as a link to follow based on that rel value.GitHub repos contain an organization object that has a URL one can follow. Note: GitHub does follow the Web Linking spec for certain links. They include a Link header with prev and next links.
  25. We prefer the Web Linking style, which can be expressed in both XML and JSON styles. It adheres to a standard that anyone can follow. Also, we can utilize the standard link relations where appropriate.
  26. GitHub’s API prefers an out-of-band approach. The alternative is based on HTML forms. Here’s a snippet of the Siren format using actions.
  27. Inline form-style actions provide greater insight to developers exploring the API via HTTP. It allows the server to maintain control of the preferred method, href, and fields. This approach allows for easier inclusion of hidden field values the server deems necessary. Note: This is still emerging and is not yet widespread.
  28. Flickr includes metadata such as number of views, server, and favorites inline with the data representation. Dropbox has a separate metadata resource that returns its metadata.
  29. Actually, we think both these options are good. If the amount of metadata is relatively small, including it inline makes a lot of sense, as it’s less overhead than creating a brand new resource.If metadata happens to be very large, as may be the case for Dropbox, adding a separate resource may make sense. At this point, the metadata itself may be important enough to your API consumers to warrant a new resource. This is a good topic for discussion during an API modeling exercise.Metadata can also include response times, pagination counts, etc.
  30. Simultaneous presentation of information and controls such that the information becomes the affordance through which the user obtains choices and selects actions.Not a linear progression, more of a directed acyclic graph.Offers choices for users to select actions.Offers links to related representations.
  31. ALPS example from rstat.us.
  32. ALPS example from rstat.us.
  33. Links, Queries, Write Templates
  34. Properties, Entities, Actions, Links
  35. Benefits: Only one HTTP call. Binary files can be sent in binary format—more compact than base64. HTTP tools to handle this.
  36. Benefits: Quick to implement. Good for small files.
  37. Benefits: Good for larger binary files.
  38. Just choose one method of submitting binary data in your API. Think about the options, how big your binary data will be, and where you want to go in the future. Even though there are trade-offs to each approach, they’re all capable.
  39. 30 Days
  40. Yes, it’s important to not beat up your API server with requests. It’s also important to let client knows if they can save a round-trip to your server.