API Design Anti-Patterns

35
API DESIGN ANTI- PATTERNS Jason Harmon API Design @PayPal @Braintree @jharmn

Transcript of API Design Anti-Patterns

Page 1: API Design Anti-Patterns

API DESIGN ANTI-PATTERNS

Jason HarmonAPI Design @PayPal @Braintree

@jharmn

Page 2: API Design Anti-Patterns

JASON HARMON

• From Austin, TX• Head of API Design at PayPal• Moving into Braintree• Blogger at apiux.com,

pragmaticapi.com• Organizer austinapi.com

meetup• Youtube: API Workshop

• https://www.youtube.com/channel/UCKK2ir0jqCvfB-kzBGka_Lg

Page 3: API Design Anti-Patterns

COLLECTOR OF MISTAKESJob #1 in creating consistent DX

Page 4: API Design Anti-Patterns

MIXED UPCONVENTION

SPath, query parameters,

headers, fieldsresourceNameresource-nameresource_name

PICK ONE, BE CONSISTENT!

Page 5: API Design Anti-Patterns

PARAMETER CONFUSIONPath, Query, Body, Header?

Page 6: API Design Anti-Patterns

• A few rules of thumb:

• Path: required, resource-identifier

• Query: optional, query collections

• Body: resource-specific/logic

• Header: global/platform-wide

API PARAMETERS

Page 8: API Design Anti-Patterns

JSON JUNK DRAWERTL;DR

Useful for client-defined fields/val-ues

Not a good way to extend your APIJust add fields to resposne

Don’t add new required fields to re-quests

Page 9: API Design Anti-Patterns

SEQUENTIALIDENTIFIERS/invoices/8765432Usually derived from database sequences

+1 each time a resource is created

Page 10: API Design Anti-Patterns

• https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References

• Developers suck at securing resources

• Better to use non-sequential strings for resource IDs

• UUID/GUID is an obvious option

INSECURE DIRECT OBJECTREFERENCE

Page 11: API Design Anti-Patterns

IDENTITY IN URLS/license?user=BR548076/license?token=E43FD312

/users/T22000129/license

Page 12: API Design Anti-Patterns

HTTP DEFINES AUTHhttp://tools.ietf.org/html/rfc7235#section-4.2

Use the Authorization header + token

Page 13: API Design Anti-Patterns

DON’T FORGET THE LOGSMost web servers/proxies/intermediaries log:Verb + URL, not often query, rarely headers

Page 14: API Design Anti-Patterns

RELAX.These are pretty easy fixes, if it’s not live yet (or v2).

Plus, there’s a bright future.

Page 15: API Design Anti-Patterns

DESIGN FIRSTThere’s really not a reasonable debate

Page 16: API Design Anti-Patterns

A DESIGN REMEDIALThinking developer experience

Page 17: API Design Anti-Patterns

DESIGN THINKING: RULESAPIs are for humans and machines

Innovate

The human rule• All design activity is ultimately social in

natureThe ambiguity rule• Design thinkers must preserve ambiguityThe re-design rule• All design is re-designThe tangibility rule• Making ideas tangible always facilitates

communication

Page 18: API Design Anti-Patterns

DESIGN THINKING: TOOLS

• Understanding your audiences thoughts, desires, beliefs and actions

• Co-creating outcomes with that audience

• Creating early versions or prototypes and testing for fit / relevance / acceptability

• Root cause analysis, five whys, mindmapping

Page 19: API Design Anti-Patterns

AUTOMATESpec-driven development

}

Page 20: API Design Anti-Patterns

DESIGNCollaborate on new design in API spec

Page 21: API Design Anti-Patterns

GOVERNANCEValidate design against API standards

Page 22: API Design Anti-Patterns

CREATE STANDARDSMake the rules, and stick to them

Page 23: API Design Anti-Patterns

STANDARDSSome of the primary concerns

• Authentication/Authorization

• Versioning• Naming conventions

for URLs, parameters, headers

• Interaction patterns with verbs

• Paging/sorting• Hypermedia

semantics

Page 25: API Design Anti-Patterns

DISCOVERRender specs in developer portal

Indicate planned APIs vs live

Page 26: API Design Anti-Patterns

VISUALIZE SPECS

Many open source options• Swagger-UI• RAML API Portal• Apiary• Numerous options on

Github• Host it and make it

known

Hosted services• Example:

http://gelato.io

Page 28: API Design Anti-Patterns

MOCKFake it ‘til you make it

Again, many open source options• Swagger, RAML,

Blueprint all have Github projects

Custom-build• Define controllers• Link responses to

samples

Host• Make URLs available to

clients for feedback

Page 29: API Design Anti-Patterns

DEVELOPBuild APIs according to specs

Validate request/response in app from spec

Page 30: API Design Anti-Patterns

DEVELOP/VALIDATE

Validate request/response against spec in acceptance tests• Emerging area in open

source

Validate request in API against spec• Also, emerging area in

some languages• Potentially processable

in proxy/facade layer

Page 31: API Design Anti-Patterns

VALIDATE DESIGNCheck request/response vs spec in acceptance tests

BDD FTW

Page 32: API Design Anti-Patterns

ACCEPTANCE TESTING

API acceptance testing means HTTP clients• Not to say you shouldn’t do

unit testing

Define english-readable acceptance criteria• BDD approaches work

remarkably well• Chakram JS is a great way to

start

Ensure visibility• Integrate into CI• Test failures should indicate

what’s wrong to anyone• Product should only accept

stories when tests are green

Page 33: API Design Anti-Patterns

GO LIVE!Be sure to integrate validation with CI

Page 34: API Design Anti-Patterns

WORKS AS DESIGNEDYou can still always screw up, so be smart

Page 35: API Design Anti-Patterns

Jason HarmonAPI Design @PayPal @Braintree

@jharmn