Slide 1

Slide 1 text

Building API For The REST of Us — Terry Tai

Slide 2

Slide 2 text

About Me

Slide 3

Slide 3 text

Host of Teahour.FM

Slide 4

Slide 4 text

Creator of Railscasts-China

Slide 5

Slide 5 text

I’m working for My Color Way 619'4 䨅⃚

Slide 6

Slide 6 text

Co-founder of fengche.co

Slide 7

Slide 7 text

Co-team of Peatio Project

Slide 8

Slide 8 text

Let’s Building API

Slide 9

Slide 9 text

Conditions • Based on Ruby on Rails • Not a pure API service, web is still the first-class citizen • Client builder is resource owner or ourselves

Slide 10

Slide 10 text

1. Stack Choice

Slide 11

Slide 11 text

VS

Slide 12

Slide 12 text

Performance

Slide 13

Slide 13 text

Flexibility

Slide 14

Slide 14 text

Level of abstraction

Slide 15

Slide 15 text

Community

Slide 16

Slide 16 text

I like Grape a little bit more!

Slide 17

Slide 17 text

DSL Higer Abstraction

Slide 18

Slide 18 text

Isolation

Slide 19

Slide 19 text

Michael Bleigh Grape is created by my coworker in Intridea. He is also the creator of oauth2, omniauth, hashie, multi_json …

Slide 20

Slide 20 text

2. Routes & Version

Slide 21

Slide 21 text

In Rails

Slide 22

Slide 22 text

In Grape

Slide 23

Slide 23 text

Rails with version in header

Slide 24

Slide 24 text

Rails with version in header

Slide 25

Slide 25 text

Rails with version in header

Slide 26

Slide 26 text

Grape with version in header

Slide 27

Slide 27 text

3. Request & Params

Slide 28

Slide 28 text

Params Encoding application/x-www-form-urlencoded multipart/form-data application/json

Slide 29

Slide 29 text

Sending Params

Slide 30

Slide 30 text

Rails server side

Slide 31

Slide 31 text

Grape server side

Slide 32

Slide 32 text

Grape params real world example

Slide 33

Slide 33 text

4.Authentication

Slide 34

Slide 34 text

Basic Auth

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

With HTTPS?

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

Token Based Auth

Slide 39

Slide 39 text

Token Based Auth • Simple • A little bit more secure than Basic Auth • Muti-tokens for authorisation

Slide 40

Slide 40 text

Digest Based Auth

Slide 41

Slide 41 text

What we use?

Slide 42

Slide 42 text

Open Source Exchange

Slide 43

Slide 43 text

Ancun

Slide 44

Slide 44 text

Zhiren

Slide 45

Slide 45 text

Signature based Authentication?

Slide 46

Slide 46 text

Amazon use the similar strategy

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

One request includes: • access_key • tonce • payload • signature

Slide 49

Slide 49 text

Signature

Slide 50

Slide 50 text

payload

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

Everything Work Well until..

Slide 53

Slide 53 text

payload

Slide 54

Slide 54 text

WTF is that?

Slide 55

Slide 55 text

Why not use JSON?

Slide 56

Slide 56 text

One request includes: • access_key • tonce • payload • signature

Slide 57

Slide 57 text

Strategy • Put business related data in payload as JSON • Put authentication related data out of payload

Slide 58

Slide 58 text

Simpler than Amazon

Slide 59

Slide 59 text

5.Resource Presenter

Slide 60

Slide 60 text

If you use Grape

Slide 61

Slide 61 text

If you use Rails

Slide 62

Slide 62 text

The most quick way

Slide 63

Slide 63 text

Extract a Presenter layer

Slide 64

Slide 64 text

Extract a Presenter layer

Slide 65

Slide 65 text

Treat it as View!

Slide 66

Slide 66 text

Jbuilder

Slide 67

Slide 67 text

–DHH “Every time you use a loop in your view, but you don’t use partial, you might be wrong.”

Slide 68

Slide 68 text

Jbuilder

Slide 69

Slide 69 text

RABL

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

It’s not View

Slide 72

Slide 72 text

Active Model Serializers

Slide 73

Slide 73 text

View A new layer VS

Slide 74

Slide 74 text

Two Stories ̽Terry ݏݏᦖඳԪ̾

Slide 75

Slide 75 text

Story 1

Slide 76

Slide 76 text

After user signup send him/her a welcome email

Slide 77

Slide 77 text

Where to put this line?

Slide 78

Slide 78 text

User model callback

Slide 79

Slide 79 text

after_create ?

Slide 80

Slide 80 text

after_commit on create

Slide 81

Slide 81 text

Send in Callback

Slide 82

Slide 82 text

Send in Controller

Slide 83

Slide 83 text

Which one is the BEST way?

Slide 84

Slide 84 text

I don’t know

Slide 85

Slide 85 text

The second solution is from Rails Guides

Slide 86

Slide 86 text

Story 2

Slide 87

Slide 87 text

Jan Xie Ex-Intridea programmer Ex-Peatio co-member Founder of Cryptape ruby-pinyin author ruby-ethereum author My darling….

Slide 88

Slide 88 text

His last project in Ruby?

Slide 89

Slide 89 text

Python, Go

Slide 90

Slide 90 text

Sinatra Node

Slide 91

Slide 91 text

When A record created, B,C,D must be created at the same time

Slide 92

Slide 92 text

A B C D

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

Communicating emotions

Slide 96

Slide 96 text

It’s become better but not BEST!

Slide 97

Slide 97 text

What’s the BEST way?

Slide 98

Slide 98 text

Jan’s solution — Service

Slide 99

Slide 99 text

My solution — PubSub

Slide 100

Slide 100 text

My solution — PubSub

Slide 101

Slide 101 text

My solution — PubSub

Slide 102

Slide 102 text

My solution — PubSub You can use Wisper gem to do similar thing

Slide 103

Slide 103 text

Two hours PK…

Slide 104

Slide 104 text

We decide change Nothing

Slide 105

Slide 105 text

Maybe, there is no BEST way We need know why people think different We need know compromise

Slide 106

Slide 106 text

Welcome to Chengdu ́౮᮷҅ Ӟଷ๶ԧ੪ӧమᐶ୏ጱउ૱̶͂

Slide 107

Slide 107 text

Spicy Food

Slide 108

Slide 108 text

Girls

Slide 109

Slide 109 text

Spicy Food

Slide 110

Slide 110 text

Girls

Slide 111

Slide 111 text

RubyConf China in Chengdu

Slide 112

Slide 112 text

We are hiring!

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

BTW҅I’m ́ፗካ͂

Slide 115

Slide 115 text

Enjoy your “one night in Chengdu”