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

Creating Solid APIs - PyCon Estonia 2018

Rivo Laks
October 04, 2018

Creating Solid APIs - PyCon Estonia 2018

Presented at PyCon Estonia 2018

Creating APIs that other developers love to use isn't trivial. I'll share some tips and best practices.

See also: https://rivolaks.com/posts/creating-solid-apis/

Rivo Laks

October 04, 2018
Tweet

More Decks by Rivo Laks

Other Decks in Programming

Transcript

  1. Versioning Schemes Using Accept header GET /projects HTTP/1.0 Accept: application/json;

    version=1 Using URL path GET /v1/projects HTTP/1.0 Accept: application/json
  2. Versioning Schemes Cont. Integers ( v1 ) vs dates (

    2018-10-04 )? Dates are less emotional
  3. Versioning Schemes Cont. Integers ( v1 ) vs dates (

    2018-10-04 )? Dates are less emotional Easier internal / test versions
  4. Version Transformers » » Requests into newer version » »

    Core code is for latest version « « Responses into older version « «
  5. Version Transformers » » Requests into newer version » »

    Core code is for latest version « « Responses into older version « « Won't work for big, breaking changes
  6. OAuth 2.0 For creating platforms Complex, but solves many issues

    Many packages, e.g. Django OAuth Toolkit, OAuthLib
  7. "data": [ { "type": "project", "id": "289", "links": { "self":

    "https://example.com/api/v1/projects/289" }, "attributes": { "created": "2018-06-28T22:52:08.690486Z", "name": "Allison-Patterson", "description": "aggregate collaborative models" }, "relationships": {...} }, ... ],
  8. "data": [{ ... "relationships": { "created_by": { "data": { "type":

    "user", "id": "199" } }, "epics": { "data": [ { "type": "epic", "id": "3101" } ], } } }, ... ],
  9. "included": [ { "type": "epic", "id": "3101", "attributes": { "created":

    "2018-06-28T22:50:45.885691Z", "name": "Ergonomic background extranet" }, "links": { "self": "https://example.com/api/v1/epics/3101" } }, { "type": "user", "id": "199", "attributes": {...} } ]
  10. Flexibility Con gurable elds: GET https://example.com/api/v1/projects GET https://example.com/api/v1/projects \ ?included=comments

    GET https://example.com/api/v1/projects \ ?included=comments&fields[project]=name,comments
  11. Errors POST https://example.com/api/v1/projects { "errors": [ { "title": "Invalid Attribute",

    "detail": "Name must contain at least three letters.", "source": { "pointer": "/data/attributes/name" }, "code": "name_too_short", "status": "422" } ] }
  12. What Should Go In There? The purpose How do I

    access it? Do I need developer account?
  13. What Should Go In There? The purpose How do I

    access it? Do I need developer account? Root URL, etc
  14. What Should Go In There? The purpose How do I

    access it? Do I need developer account? Root URL, etc Authentication info
  15. What Should Go In There? General encodings, formats, etc Versioning,

    pagination, etc Common errors Code for getting started
  16. Schema & Autogeneration OpenAPI, Swagger, etc Use your tools Combine

    docs & code examples Client libs autogeneration