Upgrade to Pro — share decks privately, control downloads, hide ads and more …

REST API Design

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

REST API Design

Updated REST API Design slides for lecture at NCSU. Spring 2018.

Michael DeHaan

February 06, 2018

Transcript

27 slides
  1. Why REST § Web services are especially popular § Cross-language

    support § Users know how to use it § Reduce documentation § Reduce coding of a separate API/UI path
  2. Things To Watch For § Consistency in URLS, Error Codes,

    Search, Pagination § Id/URL as primary identifier § Discoverability § Security: Authorization, Authentication, Privacy § Testing
  3. History § XMLRPC 1998, Dave Winer – Userland/Microsoft § SOAP

    1998, Winer/various – Microsoft § REST 2000, Roy Fielding, UC Irvine
  4. When § YES: External Facing Services § MAYBE: Internal Services

    § But Also: § Message Buses/Queues § gRPC/other
  5. Verbs § CRUD: § Create – HTTP POST § Retrieve

    – HTTP GET § Update – HTTP PUT § Delete – HTTP DELETE
  6. Versioning § GET http://example.com/api/ Returns HTTP 200 { “versions” :

    { “1.0” : “http://example.com/api/v1” }, “current” : “http://example.com/api/v1” }
  7. Discoverability § GET http://example.com/api/v1/ Returns HTTP 200 { “venues” :

    http://example.com/api/v1/venues, “bands” : “http://example.com/api/v1/bands”, ”shows” : “http://example.com/api/v1/shows” }
  8. Read: Collections § GET http://example.com/api/v1/bands [ { id: 1, href:

    “http://example.com/api/v1/bands/1” name: “Van Halen” }, … ]
  9. Read: Specific Records § GET http://example.com/api/v1/bands/1 { id: 1, href:

    “http://example.com/api/v1/bands/1” name: “Van Halen” }
  10. Search § GET http://example.com/api/v1/bands/?genre=rock [ { “id:” : 1, “name”

    : “Van Halen”, “href” : http://example.com/api/v1/bands/1, “genre” : “rock” } ] --- POSSIBLY: GET http://…/bands?founded_lt=1990&genre=rock GET http://…/bands?founded_in=1997,1998
  11. Sorting § GET http://example.com/api/v1/bands/?order_by=name [ { “id:” : 1, “name”

    : “Van Halen”, “href” : http://example.com/api/v1/bands/1, “genre” : “rock” } ]
  12. Pagination § http://example.com/api/v1/bands?page=1&size=50 { “page” : 1, “count” : 500,

    “prev” : None, “next” : “http://….” “last”: 500 “items” : [ … ] }
  13. Create § POST http://example.com/api/v1/bands { “name” : “Rush”, “genre” :

    “Rock”, … } RETURNS HTTP 201 { “id” : 2, “name” : “Rush”, … “href” : “http://example.com/api/v1/bands/2”, }
  14. Update § PUT http://example.com/api/v1/bands { “name” : “Rush”, “genre” :

    “Prog”, … } RETURNS HTTP 200 { “id” : 2, “name” : “Rush”, … “href” : “http://example.com/api/v1/bands/2”, }
  15. General Error Codes § 200-299 Ok § 300-399 Redirects §

    400-499 User Error § 500-599 Server Error
  16. Specific Error Codes § 200 OK § 201 Created OK

    § 204 Deleted OK § 302 Redirect § 400 Bad Request § 401 Unauthorized § 403 Forbidden § 404 Not Found § 409 Conflict § 500 Internal Server Error
  17. Authentication (Humans) § POST /api/v1/login § { “user” : “bob”,

    “password” : “12345” } § => { ”session-ID” : “ABCDEFGABCDEFG” } § GET /api/v1/something_restricted § HEADER: § X-SESSION-ID: “ABCDEFGABCDEFG” § Backend looks for headers § Session table keeps track of last time token was used § Sessions not used for ~30 minutes may expire (auto-log- out) § Client handles re-login or keep-alive as needed
  18. Authorization § Because you are logged in does not mean

    you can get something § Backend code must HTTP 403 as appropriate
  19. Filtering § Private records § If not admin, maybe /api/v1/users

    should only return you § Private fields § Don’t return passwords
  20. Testing § Most REST frameworks should allow § Run database

    setup § Call some method that simulates a JSON GET/PUT/POST/DELETE § Use database methods to see if rows are present § Check error codes § For each URL § Check all verbs/methods § Unauthorized user § Authorized user § Forbidden user § Invalid inputs § Valid inputs, correct results
  21. Finishing Up § How To Tell If It’s Good §

    Discoverability, Consistency § Everything Is Paginated § UI can render any page of O(1), not O(n) § Actions and Weird Verbs § Jobs & Job Templates § Complex Endpoints for UI Simplicity § (Whiteboard Discussion)

More Decks by Michael DeHaan

Other Decks in Technology