heavybit presents: stripe's api lead amber feng on api design

43
MOVE FAST, DON'T BREAK YOUR API AMBER FENG @amfeng

Upload: dana-oshiro

Post on 30-Jun-2015

350 views

Category:

Technology


3 download

DESCRIPTION

Heavybit member and payment processing company Stripe's manages 106 endpoints, 65 versions and 6 API clients all without breaking things. This presentation was given by Stripe's API lead Amber Feng on designing APIs for engagement and ease-of-use.

TRANSCRIPT

Page 1: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

MOVE FAST,DON'T BREAK YOUR API

AMBER FENG @amfeng

Page 2: Heavybit Presents: Stripe's API Lead Amber Feng on API Design
Page 3: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

LET'S BUILDAN API!

Page 4: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

post '/v1/charges' do card_number = params[:card_number] amount = params[:amount]

charge = create_charge(card_number, amount)

json { id: charge.id, amount: charge.amount card_number: charge.redacted_card_number, success: charge.success }end

Page 5: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

post '/v1/charges' do ...

unless card_number.length == 16 return {error: "Invalid card number."} end

unless amount > 0 and amount <= CHARGE_MAX return {error: "Invalid amount."} end

...end

Page 6: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

post '/v1/charges' do api_key = get_api_key user = User.find_by_key(api_key)

unless user return {error: "Invalid API key."} end

...end

Page 7: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

curl https://stripe.com/v1/charges -u API_KEY -d card_number=4242424242424242 -d amount=100

=>

{ id: "ch_xxx", amount: 100, card_number: "*4242", success: true }

Page 8: Heavybit Presents: Stripe's API Lead Amber Feng on API Design
Page 9: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

WHAT NEXT?

Page 10: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

WHAT NEXT?MORE ENDPOINTS

Page 11: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

WHAT NEXT?MORE ENDPOINTSMORE FUNCTIONALITY

Page 12: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

WHAT NEXT?MORE ENDPOINTSMORE FUNCTIONALITYMORE CHANGES

Page 13: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

WHAT NEXT?MORE ENDPOINTSMORE FUNCTIONALITYMORE CHANGESMORE PROBLEMS

Page 14: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

LARGE, TANGLEDCODEBASE

Page 15: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

COPY-PASTA

Page 16: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

ERROR-PRONEDEPENDENCIES

Page 17: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

"CRAP, I FORGOT TO UPDATE THE DOCS!"

— Everyone ever

Page 18: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

HOW DO WEMAKE IT BETTER?

Page 19: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

DESIGN FORYOURSELF, TOO

Page 20: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

SEPARATE DIFFERENT LAYERS OF LOGIC

Page 21: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

AuthenticationValidationEndpoint-specific logicConstructing the responseError handling

Page 22: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

Error handler

Authenticator

API logic

Page 23: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

use ErrorHandleruse Authenticator

get '/v1/charges/:id' do user = env.user id = params[:id] unless user.get_charge(id) raise UserError.new("No charge #{id}!") endend

Page 24: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

APIMethods &APIResources

Page 25: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

class ChargeCreateMethod < AbstractAPIMethod required :amount, :integer required :card_number, :string

resource ChargeAPIResource def execute create_charge(amount, card_number) endend

Page 26: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

class ChargeAPIResource < AbstractAPIResource required :id, :string required :amount, :integer required :card_number, :string required :success, :boolean

def describe_card_number charge.redacted_card_number endend

Page 27: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

post '/v1/charges' do APIMethod::ChargeCreateMethod.invokeend

get '/v1/charges' do APIMethod::ChargeRetrieveMethod.invokeend

Page 28: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

MAKE IT HARD TOMESS UP

Page 29: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

class ChargeCreateMethod < AbstractAPIMethod required :amount, :integer required :card_number, :string

document :amount, "Amount, in cents." document :card_number, "The card number."

...end

Page 30: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

HIDE BACKWARDS COMPATIBILITY

Page 31: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

<todo: tweet>

Page 32: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

def execute if !user.version_1? && params[:amount] raise UserError.new("Invalid param.") end

...

if !user.version_1? response.delete(:amount) endend

Page 33: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

GATES

Page 34: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

- :version: 2014-09-24 :new_gates: - :gate: allows_amount :description: >- Sending amount is now deprecated.

Page 35: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

def execute if !user.gating(:allows_amount) && params[:amount] raise UserError.new("Invalid param.") end

...

if !user.gating(:allows_amount) response.delete(:amount) endend

Page 36: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

COMPATIBILITYLAYERS

Page 37: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

Request compatibility

API logic

Construct API response

Response compatibility

Page 38: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

IN THEREAL WORLD

Page 39: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

106 ENDPOINTS65 VERSIONS6 API CLIENTS

Page 40: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

DESIGN FOR YOURSELF:SEPARATE LAYERS OF LOGICMAKE IT HARD TO MESS UPHIDE BACKWARDS COMPAT

Page 41: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

WHAT ELSE?

Page 42: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

NOT SURE.(WE'RE STILL FIGURING IT OUTAS WE GO.)

Page 43: Heavybit Presents: Stripe's API Lead Amber Feng on API Design

THANKS! (:@amfeng