SLIDE 1 Twelve Patterns to Create Evolvable APIs
Mike Amundsen API Academy / CA @mamund
Drawings by Diogo Lucas @diogoclucas
SLIDE 2
SLIDE 3
#mcaTravels
SLIDE 4
http://apiacademy.co
SLIDE 5
SLIDE 6
SLIDE 7
SLIDE 8
SLIDE 9
SLIDE 10
SLIDE 11
?
SLIDE 12
SLIDE 13
SLIDE 14
SLIDE 15
SLIDE 16
SLIDE 17
SLIDE 18
SLIDE 19 I want to be able to...
- 1. Change/Add Objects (payloads)
- 2. Change/Add Addresses (URLs)
- 3. Change/Add Actions (links and forms)
SLIDE 20 The OAA Challenge
- 1. Change/Add Objects (payloads)
- 2. Change/Add Addresses (URLs)
- 3. Change/Add Actions (links and forms)
SLIDE 21 The OAA Challenge
- 1. Change/Add Objects (payloads)
- 2. Change/Add Addresses (URLs)
- 3. Change/Add Actions (links and forms)
"[A] dynamic system that has extreme late binding in all aspects." -- Alan Kay, 2003
SLIDE 22
Evolvable API Patterns
SLIDE 23
Twelve Patterns for Evolvable APIs
Four Design Patterns Four Basic Principles Four Shared Agreements
SLIDE 24
Design Patterns
SLIDE 25
Design Patterns
1.PASS MESSAGES, NOT OBJECTS 2.SHARE VOCABULARIES, NOT MODELS 3.USE THE REPRESENTOR PATTERN 4.PUBLISH PROFILES
SLIDE 26
SLIDE 27 Pass Messages, Not Objects
"I'm sorry that coined the term 'objects' for this
- topic. The big idea is 'messaging'."
Alan Kay, 1998
SLIDE 28
SLIDE 29
Pass Messages, Not Objects
Bodies SHOULD be sent using a highly-structured metadata-rich format such as: HAL Collection+JSON Siren UBER Atom, etc.
SLIDE 30
SLIDE 31
Pass Messages, not Objects
What problem does this solve? I don’t need to share your object model to interact with you. Machines can now manage their own internal models independently.
SLIDE 32
SLIDE 33 Share Vocabularies, Not Models
"It is easier to standardize representation and relation types than objects and object-specific interfaces."
SLIDE 34
SLIDE 35 Share Vocabularies, Not Models
All messages SHOULD rely only on standardized identifiers (for data/action) based on shared vocabularies. IANA Link Relation Values Schema.org Microformats Dublin Core Activity Streams
SLIDE 36
SLIDE 37
SLIDE 38
SLIDE 39
Share Vocabularies, Not Models
What problem does this solve? Vocabulary is how we “evaluate and select” Machines can now evaluate and select without direct human interaction.
SLIDE 40
SLIDE 41 Use the Representor Pattern
"Use a special filter, a Message Translator, between other filters or applications to translate
- ne data format into another."
- Gregor Hohpe
SLIDE 42
Use the Representor Pattern
You SHOULD implement a message translator to convert internal models into public messages. Standard Resource Model (WeSTL) Strategy Messages Format Dispatch
SLIDE 43
SLIDE 44
SLIDE 45
Use the Representor Pattern
What problem does this solve? Sometimes we need to translate our conversations in order to communicate. Machines can now “negotiate” the language of a conversation.
SLIDE 46
SLIDE 47 Publish Profiles
"Profiles provide a way to create a ubiquitous language for talking about APIs (resources) for both humans and machines."
SLIDE 48 Publish Profiles
All messages SHOULD be accompanied by
- ne or more PROFILE identifiers.
Define all possible data and actions Use Profile Standard (RFC6906) Servers emit profile URI Clients validate profile URI
SLIDE 49
SLIDE 50
SLIDE 51
SLIDE 52
SLIDE 53
Publish Profiles
What problem does this solve? I need to know what we’re talking about. Machines can now validate domain topics easily
SLIDE 54
Messages
SLIDE 55 Norman's Action Lifecycle
Donald Norman
SLIDE 56
Employing the RPW Loop
SLIDE 57
Design loosely-coupled interoperable services
SLIDE 58
Basic Principles
SLIDE 59 Basic Principles
- 5. MUST IGNORE
- 6. MUST FORWARD
- 7. PROVIDE MRU
- 8. USE IDEMPOTENCE
SLIDE 60
SLIDE 61 Must Ignore
“The main goal of the MUST IGNORE pattern
- f extensibility is to allow backwards- and
forwards-compatible changes.”
SLIDE 62
SLIDE 63
Must Ignore
Clients MUST IGNORE any data/inputs that the client does not understand.
SLIDE 64
SLIDE 65 Must Ignore
What problem does this solve? Ignoring what we don’t understand lets us “do
- ur own thing” w/o knowing everyone’s job
Machines can now focus on their
- wn job, not everyone’s job.
SLIDE 66
SLIDE 67 MUST FORWARD
“A proxy MUST forward unrecognized header fields…”
A proxy MUST forward an unknown header A proxy MUST forward unrecognized header fields
SLIDE 68
SLIDE 69
Must Forward
Clients MUST FORWARD (unchanged) any input fields (URL or FORM) that the client does not recognize.
SLIDE 70
SLIDE 71
Must Forward
What problem does this solve? We don’t edit for others around us. Machines can now co-operate w/o full understanding of other’s work
SLIDE 72
SLIDE 73 Provide MRU (Most-Recently-Used)
“A feature of convenience allowing users to quickly see and access the last few used files and documents.”
SLIDE 74
SLIDE 75
SLIDE 76
Provide MRU
Services SHOULD return the most recently-used (MRU) LINKS and FORMS in all responses.
SLIDE 77
SLIDE 78
SLIDE 79
Provide MRU
What problem does this solve? We need most-used tools close at hand Machines can now find most-used affordances easily
SLIDE 80
SLIDE 81 Use Idempotence
“Can be applied multiple times without changing the result beyond the initial application.”
SLIDE 82
SLIDE 83 Use Idempotence
All network requests SHOULD be idempotent in
- rder to allow clients to safely repeat them
when response is unclear.
SLIDE 84
SLIDE 85
Use Idempotence
What problem does this solve? If things didn’t work right the first time, we need to try again. Machines can now safely “try again”
SLIDE 86
Networks
SLIDE 87 "Data on the Inside vs. Data on the Outside, Helland (2005) http://cidrdb.org/cidr2005/papers/P12.pdf
Programming the Network
Pat Helland
SLIDE 88 "Data on the Inside vs. Data on the Outside, Helland (2005) http://cidrdb.org/cidr2005/papers/P12.pdf
Programming the Network
Pat Helland
SLIDE 89 "Data on the Inside vs. Data on the Outside, Helland (2005) http://cidrdb.org/cidr2005/papers/P12.pdf
Programming the Network
Pat Helland
SLIDE 90
Build Network-Aware Implementations
SLIDE 91
Shared Agreements
SLIDE 92 Shared Agreements
- 9. USE RELATED
- 10. USE NAVIGATION
- 11. PARTIAL SUBMIT
- 12. STATE WATCH
SLIDE 93
SLIDE 94
Use Related
“By watching what you click on in search results, Google can learn that you favor particular sites.” – Danny Sullivan, 2009
SLIDE 95
SLIDE 96
Use Related
Services SHOULD return a RELATED LINK that responds with ALL the possible actions for this context.
SLIDE 97
SLIDE 98
SLIDE 99
Use Related
What problem does this solve? I can’t remember everything, need an easy way to look up instructions. Machines can now “look up” the available affordances.
SLIDE 100
SLIDE 101 Use Navigation
“To achieve a single goal which can be broken down into dependable sub-tasks.”
- - Design Patterns (@uipatterns)
SLIDE 102
SLIDE 103
Use Navigation
Services SHOULD provide "next/previous" LINK to handle multi-step workflow with "cancel", "restart", & "done."
SLIDE 104
SLIDE 105
Use Navigation
What problem does this solve? I can’t keep all the steps in my head Machines can now navigate through a long series of steps safely.
SLIDE 106
SLIDE 107 Partial Submit
“Think of the actions as approximations of what is desired.”
SLIDE 108
SLIDE 109
Partial Submit
Services SHOULD accept partially filled-in FORM and return a new FORM with the remaining fields.
SLIDE 110
SLIDE 111
Partial Submit
What problem does this solve? I sometimes only know part of the story. Machines can now interact in small parts and not always be perfect.
SLIDE 112
SLIDE 113 State Watch
“Data representing variables in a dynamical system…”
SLIDE 114 State Watch
“Data representing variables in a dynamical system…”
SLIDE 115
SLIDE 116
State Watch
Services SHOULD allow clients to subscribe to WATCH VALUES so that clients can determine "done."
SLIDE 117
SLIDE 118
Use State Watch
What problem does this solve? My boss doesn’t always set my goals. Machines can now set their own goals and act accordingly.
SLIDE 119
Hypermedia Affordance
SLIDE 120 By Dgies - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=13691666
The words hypertext, hyperlink, and hypermedia were coined by Ted Nelson around 1965.
Ted Nelson's hyperlinks (1965)
Ted Nelson
SLIDE 121 What is Hypermedia?
[Hypermedia] is not constrained to be linear. Hypertext is text which contains links to other texts.
https://www.w3.org/WhatIs.html
SLIDE 122 Affordances
"The affordances of the environment are what it offers ... what it provides or furnishes, either for good or ill. James Gibson, 1977
James Gibson
Ecological Approach to Visual Perception, Gibson, 1979
SLIDE 123 Affordances
“When I say Hypertext, I mean the simultaneous presentation of information and controls such that the information becomes the affordance through which the user obtains choices and selects actions.” Roy Fielding, 2008
Roy Fielding
Architectural Styles and the Design of Network-based Software Architectures, Fielding, 2001
SLIDE 124
Affordances are the reason for hypermedia
SLIDE 125
Enable Connected Services
SLIDE 126
Summary
SLIDE 127
Programming the Network brings new challenges
SLIDE 128
Twelve Patterns for Evolvable APIs
Four Design Patterns Four Basic Principles Four Shared Agreements
SLIDE 129
Design Patterns (for interop)
1.PASS MESSAGES, NOT OBJECTS 2.SHARE VOCABULARIES, NOT MODELS 3.THE REPRESENTOR PATTERN 4.PUBLISH PROFILES
SLIDE 130 Basic Principles (for networks)
- 5. MUST IGNORE
- 6. MUST FORWARD
- 7. PROVIDE MRU
- 8. USE IDEMPOTENCE
SLIDE 131 Shared Agreements (for services)
- 9. USE RELATED
- 10. USE NAVIGATION
- 11. PARTIAL SUBMIT
- 12. STATE WATCH
SLIDE 132
http://g.mamund.com/12-patterns
SLIDE 133
SLIDE 134
SLIDE 135
SLIDE 136 Twelve Patterns to Create Evolvable APIs
Mike Amundsen API Academy / CA @mamund
Drawings by Diogo Lucas @diogoclucas