"api design at github". jason rudolph, github

53

Upload: yandex

Post on 10-May-2015

6.163 views

Category:

Technology


3 download

DESCRIPTION

Get a behind-the-scenes look at development on the GitHub API team. Developers and businesses rely on the stability and consistency of the GitHub API for critical tasks. Changes to the API could break production deployments (or continuous integration, authentication, etc.) for thousands of businesses. And yet, GitHub.com continues to evolve, improving existing features, and adding new ones. The GitHub API needs to evolve as well. We'll explore the design philosophies and techniques that we use to provide a reliable API, while continuing to ship improvements every day.

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