Slide 1

Slide 1 text

API Blueprint ଎शձ @Wantedly଎शձ Go Takagi github:@shimastripe 2016/5/12

Slide 2

Slide 2 text

ຊεϥΠυίʔυ • https://github.com/shimastripe/apib-sample

Slide 3

Slide 3 text

Web API Documentation

Slide 4

Slide 4 text

࡞Δͷ͕໘౗͍͘͞

Slide 5

Slide 5 text

໘౗ͳཁҼ • ࢓༷ॻͷϑΥʔϚοτ͕ఆ·͍ͬͯͳ͍ɻ • JSON Schemaʁ Swaggerʁ • ࣅͨΑ͏ͳ͜ͱΛ܁Γฦ͠ॻ͘͜ͱ΋ଟ͍ • ։ൃ༻ͷϞοΫ΋͍Δ • υΩϡϝϯτͱݱঢ়ͱͷ੔߹ੑ(maintenance) • υΩϡϝϯτ͸͋Δ͕ɺ·࣮ͩࡍʹಈ͘΋ͷ͕࣮૷͞Ε͍ͯͳ͍

Slide 6

Slide 6 text

API Blueprint

Slide 7

Slide 7 text

API Blueprint • MarkdownͰهड़͞ΕͨWeb API(ಛʹRESTful ͳAPI)ͷ࢓༷Λղऍͯ͘͠ΕΔ • ਓ͕ಡΈ΍͍͢ʂ • ԿΛ࡞ΕΔ͔ • υΩϡϝϯτ(aglio) • ϞοΫαʔόʔ(api-mock) • ςετ࣮ߦ(dredd) • ·ͱΊͯੜ੒Ͱ͖Δ͔ΒapibϑΝΠϧΛ؅ཧ͢Δ͚ͩͰࡁΉ

Slide 8

Slide 8 text

ࠓ೔ͷ͓͠ͳ͕͖ • apiblueprintΛମݧʂ • Hello world! • γϯϓϧͳRestAPIΛհͯ࣍͠ͷ3ͭΛ΍ͬͯΈΔ • υΩϡϝϯτ • ϞοΫαʔόʔ • ؆୯ͳςετ • rails gͰapibϑΝΠϧΛੜ੒͢ΔGemͷ঺հ

Slide 9

Slide 9 text

Install Battle λʔϛφϧͰҎԼΛೖྗ $ gem install rails dredd_hooks $ brew install node npm $ npm install -g aglio api-mock dredd • API Blueprint͸࢓༷ॻͳͷͰॲཧܥ͸ผ • ࠓճ͸Node.jsΛ࢖࣮ͬͯ૷͞Εͨaglioͱapi-mockͱdreddΛར༻ • aglio υΩϡϝϯτੜ੒ • api-mock ϞοΫαʔόʔੜ੒ • dredd ςετ࣮ߦ

Slide 10

Slide 10 text

Editor Package • Sublimetext • API Blueprint
 https://github.com/apiaryio/api-blueprint-sublime-plugin • Atom • language-api-blueprint
 https://github.com/danielgtaylor/atom-language-api-blueprint • Vim • apiblueprint.vim
 https://github.com/kylef/apiblueprint.vim

Slide 11

Slide 11 text

Hello world!

Slide 12

Slide 12 text

Hello world! • ͜Ε͸/messageʹGETϝιουΛ࣮ߦ͢Δͱ Content-Type͕text/plainͷ"Hello, World!"͕ฦΔ $ cat << 'EOF' > helloworld.apib # GET /message + Response 200 (text/plain; charset=utf-8) Hello, World! EOF

Slide 13

Slide 13 text

υΩϡϝϯτੜ੒

Slide 14

Slide 14 text

υΩϡϝϯτੜ੒ • 2௨Γͷख๏ • HTMLʹม׵ $ aglio -i helloworld.apib -o helloworld.html • Preview serverΛཱͯΔ • apibϑΝΠϧΛsave͢Δͨͼʹੜ੒͠ͳ͓ͯ͘͠ΕΔ • save࣌ʹจ๏Τϥʔ΋νΣοΫͯ͘͠ΕΔ $ aglio -i helloworld.apib -s

Slide 15

Slide 15 text

υΩϡϝϯτੜ੒ ͱͯ΋؆୯Ͱ៉ྷʂ

Slide 16

Slide 16 text

ϞοΫΞοϓαʔόʔΛཱͯΔ

Slide 17

Slide 17 text

ϞοΫΞοϓαʔόʔΛཱͯΔ • api-mockίϚϯυʹ.apibϑΝΠϧΛ౉͢ $ api-mock helloworld.apib • ͜ΕͰlocalhost:3000ʹϞοΫαʔόʔ͕ىಈ • ΞΫηεͯ͠ΈΔͱςΩετσʔλͰhello world!ͱग़ྗ͞ΕΔ • (http://localhost:3000/message)

Slide 18

Slide 18 text

Restful API

Slide 19

Slide 19 text

Restful API GET /message • HTTPϝιου͸ϦιʔεΛͲ͏ૢ࡞͍͔ͨ͠Λද͢ • ϦιʔεɿWeb্ʹଘࡏ͢Δʮ৘ใʯ • URL͸Ϧιʔεͷ໊લ • APIͷॲཧͷ݁Ռ͸ɺεςʔλεɾίʔυͰද͢ • ͜ͷ৔߹͸/messageʹGETͱ͍͏ૢ࡞Λ͍ͨ͠

Slide 20

Slide 20 text

Restful API ۩ମతͳΞΫγϣϯ • ϦΫΤετ(Request)ͯ͠ • αʔόʔॲཧͯ͠ • Ϩεϙϯε(Response)͕ฦΔ

Slide 21

Slide 21 text

user API • ࠓճ͸Ruby on RailsΛ༻͍ͯɺγϯϓϧͳRestfulAPIΛ࡞੒͢Δ • ·ͣ͸RailsͰҎԼΛ࣮ߦ $ rails new apib-sample --api -T $ cd apib-sample $ rails g scaffold User name age:integer admin:boolean $ rake db:migrate • --api͸APIϞʔυ (apiʹؔ͠ͳ͍ϑΝΠϧΛੜ੒͠ͳ͍) • -T͸--skip-test-unit (TestUnitΛ૊Έࠐ·ͳ͍) • rails g scaffold • σʔλϕʔε΁ͷςʔϒϧ΁ͷొ࿥(CREATE)ɺࢀর(READ)ɺߋ৽(UPDATE)ɺ࡟আ ʢDELETEʣͱ͍͏CRUDΛߦ͏WebΞϓϦέʔγϣϯͷͻͳܕͱͳΔίʔυΛࣗಈੜ੒ɻ

Slide 22

Slide 22 text

user API VTFS"1*ͷॲཧ಺༰ ର৅ͱͳΔϦιʔε ࣮ߦΞΫγϣϯ VTFSΛ௥Ճ͢Δ VTFSશମ 1045VTFST VTFSΛશͯऔಘ͢Δ VTFSશମ (&5VTFST *EͱҰக͢ΔVTFSΛऔಘ͢Δ *EͱҰக͢ΔVTFS (&5VTFST\JE^ *EͱҰக͢ΔVTFSΛߋ৽͢Δ *EͱҰக͢ΔVTFS 165VTFST\JE^ *EͱҰக͢ΔVTFSΛ࡟আ͢Δ *EͱҰக͢ΔVTFS %&-&5&VTFST\JE^

Slide 23

Slide 23 text

user API VTFS"1*ͷॲཧ಺༰ ॲཧͷ݁ՌฦΔ)551Ϩεϙϯε εςʔλείʔυ #PEZ VTFSΛ௥Ճ͢Δ ௥Ճͨ͠σʔλ VTFSΛશͯऔಘ͢Δ ର৅σʔλ *EͱҰக͢ΔVTFSΛऔಘ͢Δ ର৅σʔλ *EͱҰக͢ΔVTFSΛߋ৽͢Δ ߋ৽ͨ͠σʔλ *EͱҰக͢ΔVTFSΛ࡟আ͢Δ ۭ

Slide 24

Slide 24 text

user API • ద౰ʹuserΛ௥Ճ͢Δ $ rails console irb(main):001:0> User.create(name: "Go Takagi", age: 22, admin: true) irb(main):002:0> User.create(name: "Dean Fujioka", age: 35, admin: false) irb(main):003:0> User.create(name: "Kasumi Arimura", age: 23, admin: false)

Slide 25

Slide 25 text

user API • RailsΛ্ཱͪ͛ͯΞΫηεͯ͠ΈΔ $ rails server => Booting Puma => Rails 5.0.0.rc1 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options • jsonϑΝΠϧ͕ฦ͖ͬͯͨʂ

Slide 26

Slide 26 text

API BlueprintϑΝΠϧͷ࡞੒

Slide 27

Slide 27 text

Լ४උ

Slide 28

Slide 28 text

user.apib • ͔͜͜Β͸࡞ۀσΟϨΫτϦΛมߋ͢Δ • apib-sample/apibϑΥϧμΛ࡞੒ͯ͠ɺ user.apibϑΝΠϧΛੜ੒

Slide 29

Slide 29 text

user.apib FORMAT: 1A HOST: http://localhost:3000 # user API Welcome to the user API. # users action [/users] ## Create user [POST] ## Get users [GET] # user action [/users/{id}] ## Get user [GET] ## Update user [PUT] ## Delete user [DELETE] # Data Structures ## users (object)

Slide 30

Slide 30 text

user.apib

Slide 31

Slide 31 text

Header Section

Slide 32

Slide 32 text

Metadata section • API Blueprint͸υΩϡϝϯτͷઌ಄σʔλ͕ϝλσʔλ ηΫγϣϯͱͳ͍ͬͯΔ • কདྷతͳ֦ுͳͲʹඋ͑ͯόʔδϣϯ৘ใΛهࡌͰ͖Δ • ݱࡏ͸1A • ఏڙ͢Δαʔόʔͷϗετ΋هड़Մೳ FORMAT: 1A HOST: http://localhost:3000 # user API Welcome to the user API. # users action [/users] ## Create user [POST] ## Get users [GET] # user action [/users/{id}] ## Get user [GET] ## Update user [PUT] ## Delete user [DELETE] # Data Structures ## users (object)

Slide 33

Slide 33 text

API name & overview section • # user API ͕APIͷ໊শ • ԼʹAPIશମͷઆ໌͕ॻ͚Δ FORMAT: 1A HOST: http://localhost:3000 # user API Welcome to the user API. # users action [/users] ## Create user [POST] ## Get users [GET] # user action [/users/{id}] ## Get user [GET] ## Update user [PUT] ## Delete user [DELETE] # Data Structures ## users (object)

Slide 34

Slide 34 text

Resource sections

Slide 35

Slide 35 text

Resource sections • ઃܭॻͷϝΠϯ • ۩ମతͳશମ૾͸ӈͷΑ͏ʹͳΔ • Ϧιʔε͝ͱʹݟग़͠ͰάϧʔϓΛ͘͘Γɺ HTTPϝιουΛҰͭԼͷϨϕϧͰॻ͘ FORMAT: 1A HOST: http://localhost:3000 # user API Welcome to the user API. # users action [/users] ## Create user [POST] ## Get users [GET] # user action [/users/{id}] ## Get user [GET] ## Update user [PUT] ## Delete user [DELETE] # Data Structures ## users (object)

Slide 36

Slide 36 text

Get users [GET /users]

Slide 37

Slide 37 text

(࠶ܝ)user API VTFS"1*ͷॲཧ಺༰ ର৅ͱͳΔϦιʔε ࣮ߦΞΫγϣϯ VTFSΛ௥Ճ͢Δ VTFSશମ 1045VTFST VTFSΛશͯऔಘ͢Δ VTFSશମ (&5VTFST *EͱҰக͢ΔVTFSΛऔಘ͢Δ *EͱҰக͢ΔVTFS (&5VTFST\JE^ *EͱҰக͢ΔVTFSΛߋ৽͢Δ *EͱҰக͢ΔVTFS 165VTFST\JE^ *EͱҰக͢ΔVTFSΛ࡟আ͢Δ *EͱҰக͢ΔVTFS %&-&5&VTFST\JE^

Slide 38

Slide 38 text

(࠶ܝ)user API VTFS"1*ͷॲཧ಺༰ ॲཧͷ݁ՌฦΔ)551Ϩεϙϯε εςʔλείʔυ #PEZ VTFSΛ௥Ճ͢Δ ௥Ճͨ͠σʔλ VTFSΛશͯऔಘ͢Δ ର৅σʔλ *EͱҰக͢ΔVTFSΛऔಘ͢Δ ର৅σʔλ *EͱҰக͢ΔVTFSΛߋ৽͢Δ ߋ৽ͨ͠σʔλ *EͱҰக͢ΔVTFSΛ࡟আ͢Δ ۭ

Slide 39

Slide 39 text

Get users [GET /users] ## Get users [GET] Returns user list. + Response 200 (application/json; charset=utf-8) + Attributes (array) + Attributes (object) + id: 1 (number) - Id + name: NAME (string) + age: 1 (number) + admin: false (boolean) + created_at: `2000-01-01 00:00:00` (string) - CreatedTime + updated_at: `2000-01-01 00:00:00` (string) - UpdatedTime • #ͷ௚ޙʹ໊শɺԼʹઆ໌Λॻ͚Δ • action͸”+”Λ༻͍ͯListͰॻ͍͍ͯ͘ • ࠓճ͸഑ྻΛฦ͢Response 200

Slide 40

Slide 40 text

Get users [GET /users]

Slide 41

Slide 41 text

Action sections

Slide 42

Slide 42 text

Header • ੜ੒͞ΕͨυΩϡϝϯτͰ͸Headerʹapplication/json; charset=utf-8͕ࢦఆ͞Ε͍ͯΔ • ΑΓઃఆ͕ඞཁͳΒ+Attributesͱಉ͡֊૚ʹ+HeadersͰهࡌ + Response 200 (application/json; charset=utf-8) + Headers Connection: keep-alive Content-Type: multipart/form-data, boundary=AaB03x + Attributes (array) + Attributes (object)

Slide 43

Slide 43 text

Request, Response • ϦΫΤετ(Request)ͯ͠ • αʔόʔॲཧͯ͠ • Ϩεϙϯε(Response)͕ฦΔ ࠓճͷ৔߹͸औಘ͢Δ͚ͩͳͷͰRequest͸ͳ͍

Slide 44

Slide 44 text

Attributes • MSONͱ͍͏ه๏Λ༻͍ͯmarkdownܗࣜͰJSON΍XMLͱ͍ͬͨ ҰൠతͳϚʔΫΞοϓݴޠͷߏ଄Λදࣔ͢Δ • υΩϡϝϯτੜ੒ͷࡍʹBody΋Schema΋·ͱΊͯੜ੒ͯ͘͠ΕΔ • ΑΓෳࡶͳه๏͸͜͜΁

Slide 45

Slide 45 text

Attributes

Slide 46

Slide 46 text

Create user [POST /users]

Slide 47

Slide 47 text

Create user [POST /users] ## Create user [POST] Create a new user + Request users (application/json; charset=utf-8) + Attributes + name: NAME (string) + age: 1 (number) + admin: false (boolean) + Response 201 (application/json; charset=utf-8) + Attributes + id: 1 (number) - Id + name: NAME (string) + age: 1 (number) + admin: false (boolean) + created_at: `2000-01-01 00:00:00` (string) - CreatedTime + updated_at: `2000-01-01 00:00:00` (string) - UpdatedTime

Slide 48

Slide 48 text

Data Structures

Slide 49

Slide 49 text

Data Structures • ಉ͡σʔλΛԿ౓΋࢖͏ͷ͸໘౗ͩ͠ͳΜ͔಄ѱ͍ • Data Structuresʹఆ͓͚ٛͯ͠͹ݺͼग़͢͜ͱ͕Մೳ # Data Structures ## users (object) + id: 1 (number) - Id + name: NAME (string) + age: 1 (number) + admin: false (boolean) + created_at: `2000-01-01 00:00:00` (string) - CreatedTime + updated_at: `2000-01-01 00:00:00` (string) - UpdatedTime FORMAT: 1A HOST: http://localhost:3000 # user API Welcome to the user API. # users action [/users] ## Create user [POST] ## Get users [GET] # user action [/users/{id}] ## Get user [GET] ## Update user [PUT] ## Delete user [DELETE] # Data Structures ## users (object)

Slide 50

Slide 50 text

Data Structures • ͢Δͱ͜ͷΑ͏ʹݺ΂Δɻ͖ͬ͢Γ ## Create user [POST] Create a new user + Request users (application/json; charset=utf-8) + ……… + Response 201 (application/json; charset=utf-8) + Attributes (users) ## Get users [GET] Returns user list. + Response 200 (application/json; charset=utf-8) + Attributes (array) + (users)

Slide 51

Slide 51 text

Parameter /users{id}

Slide 52

Slide 52 text

Parameter /users{id} # user action [/users/{id}] + Parameters + id: `1` (enum[string]) - The ID of the desired user. + Members + `1` + `2` + `3` ## Get user [GET] • parameter͕͋Δ৔߹͸ॳΊʹ+parameterΛఆٛ͢Δͱ Ҏ߱ͷϦΫΤετશͯͰར༻ग़དྷΔ • ࠓճ͸MembersΛड͚ೖΕΔ࢓༷ʹ͕ͨ͠ଞʹॳظ஋΍ required΋ઃఆͰ͖Δ

Slide 53

Slide 53 text

Get user [POST /users{id}]

Slide 54

Slide 54 text

Get user [POST /users{id}] # user action [/users/{id}] + Parameters + id: `1` (enum[string]) - The ID of the desired user. + Members + `1` + `2` + `3` ## Get user [GET] Returns user. + Response 200 (application/json; charset=utf-8) + Attributes (users)

Slide 55

Slide 55 text

Update user [PUT /users{id}]

Slide 56

Slide 56 text

Update user [PUT /users{id}] ## Update user [PUT] update user. + Request users (application/json; charset=utf-8) + Attributes + name: NAME (string) + age: 1 (number) + admin: false (boolean) + Response 200 (application/json; charset=utf-8) + Attributes (users) • ߋ৽σʔλΛRequest • (idͷσʔλΛ্ॻ͖ͯ͠)Response 200

Slide 57

Slide 57 text

Delete user [DELETE /users{id}]

Slide 58

Slide 58 text

Delete user [DELETE /users{id}] ## Delete user [DELETE] Delete user. + Response 204 • (idͷσʔλΛ࡟আͯ͠) Response 204

Slide 59

Slide 59 text

Complete! • ΑΓৄࡉͳه๏Λ஌Γ͚ͨΕ͹͜͜΁

Slide 60

Slide 60 text

ςετ࣮ߦ

Slide 61

Slide 61 text

dredd • apiary͕༻ҙͨ͠ςετπʔϧɻ • apibϑΝΠϧΛݩʹαʔόʔΛୟ͍ͯϨεϙϯ είʔυͳͲͷ੔߹ੑΛνΣοΫͯ͘͠ΕΔ • ಺෦ͰGavelͱ͍͏πʔϧΛ࢖ͬͯ੔߹ੑΛ νΣοΫ͍ͯ͠Δ

Slide 62

Slide 62 text

dredd_hooks • ςετ࣮ߦ࣌ͷલޙʹҰఆͷಈ࡞ΛڬΊΔ
 (before or after) • ࠓճͷ৔߹͸parameterͷ஋Λ1͔ΒPOSTͯ͠ੜ੒͞ Εͨσʔλͷidʹ্ॻ͖ͯ͠ಈ࡞͍ͤͨ͞ɻ • ࢦఆͷ࢓ํ͸ʮϦιʔεάϧʔϓ໊ > ϦΫΤετ໊ʯ

Slide 63

Slide 63 text

POSTσʔλͷҰ࣌อଘ • apibϑΥϧμʹdredd_hooks.rbϑΝΠϧΛ࡞੒ • transaction͔ΒPOSTͷσʔλΛୀආ require 'json' include DreddHooks::Methods response_stash = {} after "users action > Create user" do |transaction| # saving HTTP response to the stash response_stash[transaction['name']] = transaction['real'] end

Slide 64

Slide 64 text

idͷऔಘ • response_stash͔ΒidΛऔಘ͢Δؔ਺ͷఆٛ def get_input(transaction, response_stash) #reusing data from previous response here parsed_body = JSON.parse response_stash['users action > Create user'] ['body'] machine_id = parsed_body['id'] #replacing id in URL with stashed id from previous response transaction['fullPath'].gsub! '1', machine_id.to_s end

Slide 65

Slide 65 text

hooksͷઃఆ • parameterΛ༻͍ΔΞΫγϣϯͷલʹઌʹఆٛ ͨؔ͠਺Λݺͼग़͢ before "user action > Get user" do |transaction| get_input(transaction, response_stash) end before "user action > Update user" do |transaction| get_input(transaction, response_stash) end before "user action > Delete user" do |transaction| get_input(transaction, response_stash) end

Slide 66

Slide 66 text

require 'json' include DreddHooks::Methods response_stash = {} def get_input(transaction, response_stash) #reusing data from previous response here parsed_body = JSON.parse response_stash['users action > Create user']['body'] machine_id = parsed_body['id'] #replacing id in URL with stashed id from previous response transaction['fullPath'].gsub! '1', machine_id.to_s end after "users action > Create user" do |transaction| # saving HTTP response to the stash response_stash[transaction['name']] = transaction['real'] end before "user action > Get user" do |transaction| get_input(transaction, response_stash) end before "user action > Update user" do |transaction| get_input(transaction, response_stash) end before "user action > Delete user" do |transaction| get_input(transaction, response_stash) end

Slide 67

Slide 67 text

configϑΝΠϧͷੜ੒ • λʔϛφϧͰapibϑΥϧμ্Ͱdredd initΛ࣮ߦ͠ɺ ԼઢͷΑ͏ʹઃఆ • ࢒Γ͸Enter $ dredd init ? Location of the API blueprint (apiary.apib) user.apib ? Command to start API backend server e.g. (bundle exec rails server) rails server -b 0.0.0.0 ? URL of tested API endpoint http://localhost:3000 ? Programming language of hooks ruby ? Do you want to use Apiary test inspector? (Y/n)

Slide 68

Slide 68 text

configϑΝΠϧͷੜ੒ • ੜ੒͞Εͨdredd.ymlͷҎԼͷͱ͜ΖΛEdit hookfiles: ./dredd_hooks.rb sorted: true

Slide 69

Slide 69 text

࣮ߦ • ੜ੒͞Εͨdredd.ymlͷҎԼͷͱ͜ΖΛEdit $ dredd complete: 5 passing, 0 failing, 0 errors, 0 skipped, 5 total complete: Tests took 2173ms complete: See results in Apiary at: https://app.apiary.io/public/ tests/run/f961c845-e6c6-4020-9d06-5c5545841b16 info: Sending SIGTERM to the backend server - Gracefully stopping, waiting for requests to finish === puma shutdown: 2016-05-10 21:04:36 +0900 === - Goodbye! Exiting

Slide 70

Slide 70 text

Testͷਫ਼౓ • Responseίʔυ͸൑ఆ͢Δ • apibϑΝΠϧͷSchemaʹఆٛ͞Εͨkey͕ଘࡏ͠ɺͦͷvalueͷ ܕ͕ҟͳΔͱ͖ʹΤϥʔΛग़͢ • ٯʹͲͪΒ͔Ͱଘࡏ͠ͳ͍key͕͋ͬͯ΋ΤϥʔʹͳΒͳ͍ • arrayͷதͷitem͸νΣοΫ͠ͳ͍ • Headerͷ൑ఆ΋ᐆດ ˒ ؆୯ͳνΣοΫͱͯ͠ར༻͢΂͖

Slide 71

Slide 71 text

apiblueprint-rails

Slide 72

Slide 72 text

apiblueprint-rails • rails generateίϚϯυͰRestAPIͷapibϑΝΠϧͷ ςϯϓϨʔτΛdocϑΥϧμʹੜ੒͢ΔGem • railsͷGemfileʹҎԼΛ௥Ճͯ͠bundleΛ࣮ߦ gem 'apiblueprint-rails' $ bundle

Slide 73

Slide 73 text

apiblueprint-rails • ੜ੒͢Δͱ͖ʹscaffoldίϚϯυ΋Ұॹʹݺͼग़͢ • ΦϓγϣϯͰ੾Γସ͑Մೳ • —apidoc-dirͰੜ੒ϑΥϧμΛมߋ • —generate-typeͰੜ੒ίϚϯυΛมߋ(none, model, …) $ rails g apiblueprint Person name age:integer admin:boolean create doc/person.apib invoke active_record create db/migrate/20160511104619_create_people.rb create app/models/person.rb invoke resource_route route resources :people invoke scaffold_controller create app/controllers/people_controller.rb

Slide 74

Slide 74 text

FORMAT: 1A # person API Write an overall API discription. # people action [/people] Write a discription. ## Create person [POST] Write a [POST] discription. + Request people (application/json; charset=utf-8) + Attributes + name: MyString (string) + age: 1 (number) + admin: false (boolean) + Response 201 (application/json; charset=utf-8) + Attributes (people) ## Delete person [DELETE] Write a [DELETE] discription. + Response 204 # Data Structures ## people (object) + id: 1 (number) - Id + name: MyString (string) + age: 1 (number) + admin: false (boolean) + created_at: `2000-01-01 00:00:00` (string) - CreatedTime + updated_at: `2000-01-01 00:00:00` (string) - UpdatedTime

Slide 75

Slide 75 text

·ͱΊ

Slide 76

Slide 76 text

·ͱΊ • apiblueprintͱͦͷपΓͷαʔϏεΛར༻ͨ͠ɻ • markdown͔ͩΒ͍͍ׅͪͪހ͕ͳͯ͘json-formatΑΓ͸Δ͔ʹݟ΍͍͢ • ͜͜਺೥ͷαʔϏε͔ͩΒ·ͩ·ͩൃలੑʹظ଴Ͱ͖Δɻ • ςετ·ΘΓʹظ଴ • ݸਓແྉ, ஂମ༗ྉͰapiaryαʔόʔ্ͰαʔϏεల։ • apibϑΝΠϧ͔ΒAPIར༻αϯϓϧίʔυͷੜ੒ • githubͱͷ࿈ܞ