Download - "API Design at GitHub". Jason Rudolph, GitHub

Transcript
Page 1: "API Design at GitHub". Jason Rudolph, GitHub
Page 2: "API Design at GitHub". Jason Rudolph, GitHub

API

Designat GitHub

Page 3: "API Design at GitHub". Jason Rudolph, GitHub

@jasonrudolph

Page 4: "API Design at GitHub". Jason Rudolph, GitHub

stability and agility

Page 5: "API Design at GitHub". Jason Rudolph, GitHub

stability

Page 6: "API Design at GitHub". Jason Rudolph, GitHub
Page 7: "API Design at GitHub". Jason Rudolph, GitHub

Humble Beginnings

{ "rate": { "limit": 5000, "remaining": 4992 }}

$ curl https://api.github.com/rate_limit

Page 8: "API Design at GitHub". Jason Rudolph, GitHub
Page 9: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992 }}

Some Change is EasyGET /rate_limit

Page 10: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992 }}

Some Change is EasyGET /rate_limit

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}

Page 11: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}}

Some Change is EasyGET /rate_limit

Page 12: "API Design at GitHub". Jason Rudolph, GitHub

not all requests are created equally

Page 13: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}}

Wither AssumptionsGET /rate_limit

Page 14: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}}

Wither AssumptionsGET /rate_limit

Page 15: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}}

Wither AssumptionsGET /rate_limit

{ "resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

Page 16: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}}

Wither AssumptionsGET /rate_limit{ "resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

Page 17: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}}

Wither AssumptionsGET /rate_limit{ "resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

$.get("https://api.github.com/rate_limit", function(data) { console.log(data["rate"]["limit"]);});

Page 18: "API Design at GitHub". Jason Rudolph, GitHub

CC BY-NC-SA 2.0h!p://flickr.com/photos/ryandonahue/2342354248

Page 19: "API Design at GitHub". Jason Rudolph, GitHub

{ "resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

Wither AssumptionsGET /rate_limit

$.get("https://api.github.com/rate_limit", function(data) { console.log(data["rate"]["limit"]);});

Uncaught TypeError: Cannot read property 'limit' of undefined

Page 20: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }}}

GET /rate_limit

{ "resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

GET /rate_limit

Page 21: "API Design at GitHub". Jason Rudolph, GitHub
Page 22: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }

GET /rate_limit

"resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

GET /rate_limit

}}

{

Page 23: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }

GET /rate_limit

"resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

,

Page 24: "API Design at GitHub". Jason Rudolph, GitHub

{ "rate": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "resources": { "core": { "limit": 5000, "remaining": 4992, "reset": 1379363338 }, "search": { "limit": 20, "remaining": 19, "reset": 1379361676 } }}

"limit": 5000, "remaining": 4992, "reset": 1379363338

"limit": 5000, "remaining": 4992, "reset": 1379363338

GET /rate_limit

Page 25: "API Design at GitHub". Jason Rudolph, GitHub

compatible > beautiful

Page 26: "API Design at GitHub". Jason Rudolph, GitHub

stability

Page 27: "API Design at GitHub". Jason Rudolph, GitHub

agility

Page 28: "API Design at GitHub". Jason Rudolph, GitHub
Page 29: "API Design at GitHub". Jason Rudolph, GitHub
Page 30: "API Design at GitHub". Jason Rudolph, GitHub
Page 31: "API Design at GitHub". Jason Rudolph, GitHub

CC BY-NC-SA 2.0h!p://flickr.com/photos/ryandonahue/2342354248

Page 32: "API Design at GitHub". Jason Rudolph, GitHub

API + agile

?

Page 33: "API Design at GitHub". Jason Rudolph, GitHub

nobody reads

Page 34: "API Design at GitHub". Jason Rudolph, GitHub

$ curl https://api.github.com/search/code?q=bacon

Be Explicit

Page 35: "API Design at GitHub". Jason Rudolph, GitHub

$ curl https://api.github.com/search/code?q=bacon

Be Explicit

{ "message": "If you would like to help us test the Search API during its preview period, you must specify a custom media type in the 'Accept' header. Please see the docs for full details.", "documentation_url": "http://developer.github.com/v3/search#preview-mode"}

=> HTTP/1.1 415 Unsupported Media Type

Page 36: "API Design at GitHub". Jason Rudolph, GitHub

$ curl https://api.github.com/search/code?q=bacon

Be Explicit

{ "message": "If you would like to help us test the Search API during its preview period, you must specify a custom media type in the 'Accept' header. Please see the docs for full details.", "documentation_url": "http://developer.github.com/v3/search#preview-mode"}

{ "message": "If you would like to help us test the Search API during its preview period, you must specify a custom media type in the 'Accept' header. Please see the docs for full details.", "documentation_url": "http://developer.github.com/v3/search#preview-mode"}

=> HTTP/1.1 415 Unsupported Media Type

Page 37: "API Design at GitHub". Jason Rudolph, GitHub

{ "message": "If you would like to help us test the Search API during its preview period, you must specify a custom media type in the 'Accept' header. Please see the docs for full details.", "documentation_url": "http://developer.github.com/v3/search#preview-mode"}

$ curl https://api.github.com/search/code?q=bacon

Be Explicit

{ "message": "If you would like to help us test the Search API during its preview period, you must specify a custom media type in the 'Accept' header. Please see the docs for full details.", "documentation_url": "http://developer.github.com/v3/search#preview-mode"}

=> HTTP/1.1 415 Unsupported Media Type

Page 38: "API Design at GitHub". Jason Rudolph, GitHub

{ "message": "If you would like to help us test the Search API during its preview period, you must specify a custom media type in the 'Accept' header. Please see the docs for full details.", "documentation_url": "http://developer.github.com/v3/search#preview-mode"}

{ "message": "If you would like to help us test the Search API during its preview period, you must specify a custom media type in the 'Accept' header. Please see the docs for full details.", "documentation_url": "http://developer.github.com/v3/search#preview-mode"}

$ curl https://api.github.com/search/code?q=bacon

Be Explicit

=> HTTP/1.1 415 Unsupported Media Type

Page 39: "API Design at GitHub". Jason Rudolph, GitHub

$ curl https://api.github.com/search/code?q=bacon -H 'Accept: application/vnd.github.preview+json'

“Open Sesame”

Page 40: "API Design at GitHub". Jason Rudolph, GitHub

{ "total_count": 212550, "items": [ ... ]}

$ curl https://api.github.com/search/code?q=bacon -H 'Accept: application/vnd.github.preview+json'

“Open Sesame”

=> HTTP/1.1 200 OK

Page 41: "API Design at GitHub". Jason Rudolph, GitHub

measure

Page 42: "API Design at GitHub". Jason Rudolph, GitHub
Page 43: "API Design at GitHub". Jason Rudolph, GitHub

evolve

Page 44: "API Design at GitHub". Jason Rudolph, GitHub

sta!-only

Page 45: "API Design at GitHub". Jason Rudolph, GitHub

sta!-only public preview

Page 46: "API Design at GitHub". Jason Rudolph, GitHub

sta!-only public preview stable

Page 47: "API Design at GitHub". Jason Rudolph, GitHub

sta!-only public preview stableAPI

Page 48: "API Design at GitHub". Jason Rudolph, GitHub

sta!-only public preview stableAPI

sta!-only publicBrowser

Page 49: "API Design at GitHub". Jason Rudolph, GitHub

agility

Page 50: "API Design at GitHub". Jason Rudolph, GitHub

stability agility

Page 51: "API Design at GitHub". Jason Rudolph, GitHub

stability agility

Page 52: "API Design at GitHub". Jason Rudolph, GitHub
Page 53: "API Design at GitHub". Jason Rudolph, GitHub