Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
API Antipatterns
Search
Mike Pearce
March 26, 2012
Technology
250
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
API Antipatterns
Everyone *knows* how to build an API. This document describes how to NOT build one.
Mike Pearce
March 26, 2012
More Decks by Mike Pearce
See All by Mike Pearce
Being Agile
mikepearce
9
4.7k
How Big Is It? A guide to agile estimation and planning
mikepearce
5
920
Effective User Stories
mikepearce
2
260
Thimbl
mikepearce
1
160
UX for Developers
mikepearce
2
340
The Shu Ha Ri of Agile
mikepearce
1
660
The Anatomical Dissection of a Sprint Backlog
mikepearce
1
320
Other Decks in Technology
See All in Technology
Minecraft JavaのMODをSwiftで作る
1mash0
0
160
AI時代、データエンジニアが一番おもろい
genshun9
0
610
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
160
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
2k
10分で知る最近のOmarchy
komagata
0
340
絵ではじめるKubernetesセキュリティ
aoi1
3
600
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
130
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
「守り」で活用するオンデバイスLLM 〜写ってはいけないを総力戦で防ぐ〜 / iOSDC Japan 2026
nakamuuu
0
160
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
2
2.1k
安心して変更できるWebフロントエンドの作り方
pirosikick
4
2.6k
幾何アルゴリズムで なめらかなピン操作を / iOSDC Japan 2026 / smoothpin
kazumanagano
0
350
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
The Invisible Side of Design
smashingmag
301
52k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
890
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
540
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
450
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
410
Transcript
API Anti Patterns or, how to not f**k up your
API
API Anti Patterns or, how to not f**k up your
API
or, tips on how to annoy your API consumers
or, think you know REST? Awesome!
or, some of the crazy s**t people do with REST
Hello
Mike Pearce
http://social-network.com /MikePearce
http://social-network.com /MikeyPearce
http://social-network.com /mikepearce.net
http://social-network.com /MikePearce
An Apology
SONISPHERE @ Knebworth Flags should be banned a festivals!
Burritos: Best. Festival. Food. Ever.
None
Mike, Lee and Rog
SORRY
( ) HTTP REQUEST: That you get on with it...
Why am I here? REST
Why am I here? REST
Why am I here? REST Hah!
Why am I here? REST Huh?! ST
Do’s ✔
Do’s Dont’s ✔ ✘
Do’s Dont’s Whatevs.. ✔ ✘ ☠
But first... Some background
Who? Roy Fielding (the grandfather)
There!
Architectural Styles and the Design of Network- based Software Architectures
Can’t sleep? Read this...
None
A quick primer And now ...
REST != HTTP
REST != HTTP REST != The Web
REST
REST IS NOT
REST IS NOT HARD
REST IS NOT HARD Seriously!
Standards? We don’t need no steenkin’ standards!
MY CONSTRAINTS, LET ME SHOW YOU THEM
Some verbs...
Some nouns...
GET
PINT
PINT Please!
ANTI patterns Onto the main event
Overuse of ...
GET
None
Overuse of GET and POST or, GET/POST tunnelling.
None
None
BAD http://api.flickr.com/services/ rest/?method= flickr.photos.people.add &api_key=nnn&photo_id=yyy&u ser_id=xxx GET:
PUT: /user/MikePearce api_key=moo& age=33& size=medium& power=flight GOOD
PUT or POST? ASIDE PUT: /users/MikePearce PUT: /links/google PUT: /articles/100805/putorpost
PUT or POST? ASIDE POST: /documents/save name=styleguide.css& category=design
PUT or POST? ASIDE PUT when the resource will live
at the target URI POST when you want the server to handle the location of the resource.
POST: /dostuff/ user=MikePearce& action=delete& api_key=moo& token=quack& mode=3 BAD
GOOD DELETE: /user/MikePearce Wait! What? Why!?
Tunneling Errors through 200 OK?
Are you OK? I’m fine! Great! A 200 OK!
I’m fine! Are you OK? ARGGHH! He doesn’t understand me!
Great! A 200 OK!
This is better...
GET: /droid/r2d2 GET: /droid/c3po 404: Not the droids you’re looking
for
HTTP/1.1 200 OK Content-Type: text/plain <?xml version="1.0" encoding="UTF-8" ?> <response
code="error"> <error>Error!</error> <text>You have errored.</text> </response> What am I supposed to do with this?
RESPONSE CODES Which leads me nicely to...
IE has failed Informational
Success FTW!1
Redirection
Client Error (you try illustrating client error!)
Server Error It’s 1am. I can’t find an image for
server error.
HTTP/1.1 200 OK PUT: /user/MikePearce Meh..
HTTP/1.1 201 CREATED PUT: /user/MikePearce Huzzah!
HTTP/1.1 418 GET: /whatareyou
HTTP/1.1 418 I’m a teapot GET: /whatareyou This one is
real1!!
Caching
None
E-Tags
HTTP/1.1 304 NOT MODIFIED HTTP/1.1 200 OK Date: Mon, 23
May 2005 22:38:34 GMT Last-Modified: Wed, 08 Jan 2003 23:11:55 Etag: "3f80f-1b6-3e1cb03b" Connection: close Content-Type: text/html; charset=UTF-8
Mmm ... Delicious!
NO
HYPERMEDIA
HYPERMEDIA What is it?
HYPERMEDIA What is it?
HYPERMEDIA AS THE ENGINE OF APPLICATION STATE
oar...
HATEOAS (Remember hating oars)
Grey Areas
V3r510n1ng Versioning
GET: /user/MikePearce Him again. Prolific bastard.
GET: /user/MikePearce GET: /user/66
GET: /v1/user/MikePearce 1. Versioning with the URI GET: /v2/user/66
GET: /user/66 2. Not versioning the primary URI GET: /v1/user/MikePearce
GET: /user/66 3. No versioning
Document Extensions
Either
Either GET: /reports/tpsreport/summary.json GET: /reports/tpsreport/summary.xml
Either GET: /reports/tpsreport/summary.json GET: /reports/tpsreport/summary.xml or
Either GET: /reports/tpsreport/summary.json GET: /reports/tpsreport/summary.xml or Accept: text/xml Accept: application/json
SUM MARY Phew!
Overuse of GET and POST or, GET/POST tunnelling.
Tunneling Errors through 200 OK?
RESPONSE CODES Which leads me nicely to...
E-Tags
NO
HATEOAS (Remember hating oars)
V3r510n1ng Versioning
Either GET: /reports/tpsreport/summary.json GET: /reports/tpsreport/summary.xml or Accept: text/xml Accept: application/json
Any questions? (that I can answer!)
Photo Credits Wordle.net flickr.com/photos/wouterkiel/3717057757/ - Wouter Kiel flickr.com/photos/joe_13/19946186/ - joe_13
flickr.com/photos/23846880@N00/391925649/ - Rutger de Moddertukker flickr.com/photos/mararie/264942105/ - mararie flickr.com/photos/ndanger/7841795/ - ndanger flickr.com/photos/yourdon/2573762303/ - Ed Yourdon flickr.com/photos/thunderchild5/225675773/ - Thunderchild7 flickr.com/photos/duchamp/126115989/ - Duchamp flickr.com/photos/thefangmonster/490423135/ - The fang monster flickr.com/photos/nostri-imago/2894328425/ - cliff1066 flickr.com/photos/epsos/4582789354/ - epSos.de flickr.com/photos/projector/2092517108/ - allie pasquier flickr.com/photos/nickstone333/3135320160/ - nickstone333 flickr.com/photos/rdrcollection/116454033/ - Rodney Ramsey flickr.com/photos/christophercarfi/2730304130/ - Christophercarfi flickr.com/photos/turatti/4526352835/ - jaci xIII
Mike Pearce
[email protected]
mikepearce.net twtitter.com/mikepearce Thanks!