Slide 1

Slide 1 text

©2018 Wantedly, Inc. Proto definition file (.proto file) Ͱ JSON API ͷ schema Λ؅ཧ͢Δ 29.Jan.2019 - Nao Minami (@south37) Wantedly, Inc. Meguro.rb#23

Slide 2

Slide 2 text

©2018 Wantedly, Inc. ࣗݾ঺հ

Slide 3

Slide 3 text

©2018 Wantedly, Inc. /BP.JOBNJ *OGSBTUSVDUVSF&OHJOFFS 8BOUFEMZ *OD (JU)VCTPVUI 5XJUUFSTPVUI 43&ͱͯ͠ͷ໾ׂʢαʔϏεͷ৴པੑʹ੹೚ʣ ։ൃج൫ͱͯ͠ͷ໾ׂʢΤϯδχΞͷੜ࢈ੑʹ੹೚ʣ

Slide 4

Slide 4 text

©2018 Wantedly, Inc. എܠ.JDSPTFSWJDFT"SDIJUFDUVSFͷ౷߹ٕज़ͱ ͯ͠ԿΛબͿ΂͖͔ ఏҊQSPUPpMFͰ3BJMT੡+40/"1*ͷ TDIFNBΛ؅ཧ͢Δ ·ͱΊ "HFOEB

Slide 5

Slide 5 text

©2018 Wantedly, Inc. എܠ.JDSPTFSWJDFT"SDIJUFDUVSFͷ౷߹ٕज़ͱ ͯ͠ԿΛબͿ΂͖͔ ఏҊQSPUPpMFͰ3BJMT੡+40/"1*ͷ TDIFNBΛ؅ཧ͢Δ ·ͱΊ "HFOEB

Slide 6

Slide 6 text

©2018 Wantedly, Inc. .JDSPTFSWJDFT

Slide 7

Slide 7 text

©2018 Wantedly, Inc. w .JDSPTFSWJDFTͷϝϦοτ w ٕज़ҟ࣭ੑ w εέʔϦϯά w σϓϩΠ༰қੑ w ૊৫໘ͷҰக w FUD .JDSPTFSWJDFT ग़యʰϚΠΫϩαʔϏεΞʔΩςΫνϟʱΦϥΠϦʔɾδϟύϯ

Slide 8

Slide 8 text

©2018 Wantedly, Inc. .JDSPTFSWJDFT͸ Ͳ͏౷߹͢Δ΂͖͔ʁ

Slide 9

Slide 9 text

©2018 Wantedly, Inc. w .JDSPTFSWJDFTͷཧ૝తͳ౷߹ٕज़ w ഁյతมߋΛճආͰ͖Δ w "1*͕ٕज़ඇґଘ w ίϯγϡʔϚʹͱͬͯ୯७ͳαʔϏε w ಺෦ͷ࣮૷ৄࡉΛӅ͢ .JDSPTFSWJDFTͷ౷߹ٕज़ ग़యʰϚΠΫϩαʔϏεΞʔΩςΫνϟʱΦϥΠϦʔɾδϟύϯ

Slide 10

Slide 10 text

©2018 Wantedly, Inc.

Slide 11

Slide 11 text

©2018 Wantedly, Inc. w HSQDͷಛ௃ w 1SPUPDPM#V⒎FSpMF QSPUPpMF ʹΑΔ TDIFNB؅ཧ w CJOBSZGPSNBUͱTFSJBMJ[FEFTFSJBMJ[F ίʔυͷࣗಈੜ੒ w )551Λར༻ͨ͠ޮ཰తͳUSBOTQPSU HSQDͱ͸

Slide 12

Slide 12 text

©2018 Wantedly, Inc. w HSQDͷಛ௃ w 1SPUPDPM#V⒎FSpMF QSPUPpMF ʹΑΔ TDIFNB؅ཧ w CJOBSZGPSNBUͱTFSJBMJ[FEFTFSJBMJ[F ίʔυͷࣗಈੜ੒ w )551Λར༻ͨ͠ޮ཰తͳUSBOTQPSU HSQDͱ͸

Slide 13

Slide 13 text

©2018 Wantedly, Inc. ͨͩɺ༷ʑͳࣄ৘ͰHSQDಋೖ ʹࢸΒͳ͍έʔε͕͋Δɻɻɻ

Slide 14

Slide 14 text

©2018 Wantedly, Inc. HSQDΛ࢖Θͣͱ΋Կͱ͔ͳ Βͳ͍͔ʁ

Slide 15

Slide 15 text

©2018 Wantedly, Inc. w HSQDͷಛ௃ w 1SPUPDPM#V⒎FSpMF QSPUPpMF ʹΑΔ TDIFNB؅ཧ w CJOBSZGPSNBUͱTFSJBMJ[FEFTFSJBMJ[F ίʔυͷࣗಈੜ੒ w )551Λར༻ͨ͠ޮ཰తͳUSBOTQPSU HSQDͱ͸

Slide 16

Slide 16 text

©2018 Wantedly, Inc. QSPUPpMFͰ3BJMT੡+40/"1*ͷ TDIFNBΛ؅ཧ͢Δ࢓૊ΈΛ࡞ͬͨ

Slide 17

Slide 17 text

©2018 Wantedly, Inc. എܠ.JDSPTFSWJDFT"SDIJUFDUVSFͷ౷߹ٕज़ͱ ͯ͠ԿΛબͿ΂͖͔ ఏҊQSPUPpMFͰ3BJMT੡+40/"1*ͷ TDIFNBΛ؅ཧ͢Δ ·ͱΊ "HFOEB

Slide 18

Slide 18 text

©2018 Wantedly, Inc. 1SPUPEFGJOJUJPOGJMF QSPUPGJMF ͱ͸ message Person { string name = 1; int32 id = 2; string email = 3; } ࢀߟϦϯΫIUUQTEFWFMPQFSTHPPHMFDPNQSPUPDPMCV⒎FST

Slide 19

Slide 19 text

©2018 Wantedly, Inc.

Slide 20

Slide 20 text

©2018 Wantedly, Inc. QSPUPpMFͷ಺༰͸+40/ Λهड़Ͱ͖Δ

Slide 21

Slide 21 text

©2018 Wantedly, Inc. QSPUPGJMFͰ+40/Λهड़͢Δ message Person { string name = 1; int32 id = 2; string email = 3; } { "name": "Taro", "id": 13, "email": "[email protected]" } QSPUPpMF +40/

Slide 22

Slide 22 text

©2018 Wantedly, Inc. QSPUPpMF͔Βίʔυੜ੒Λߦ͏

Slide 23

Slide 23 text

©2018 Wantedly, Inc. w TFSWFSTJEFͷίʔυੜ੒ w DMJFOUTJEFͷίʔυੜ੒ QSPUPGJMF͔Βͷίʔυੜ੒

Slide 24

Slide 24 text

©2018 Wantedly, Inc. w TFSWFSTJEFͷίʔυੜ੒ w DMJFOUTJEFͷίʔυੜ੒ QSPUPGJMF͔Βͷίʔυੜ੒

Slide 25

Slide 25 text

©2018 Wantedly, Inc. message Person { string name = 1; int32 id = 2; string email = 3; } module PersonAttributes extend ActiveSupport::Concern included do attribute :name attribute :id attribute :email end end QSPUPpMF SVCZ QSPUPGJMF͔ΒTFSWFSTJEFͷίʔυੜ੒ w "DUJWF.PEFM4FSJBMJ[FSͷίʔυΛੜ੒

Slide 26

Slide 26 text

©2018 Wantedly, Inc. class PersonSerializer < ApplicationSerializer include PersonAttributes end QSPUPGJMF͔ΒTFSWFSTJEFͷίʔυੜ੒ w ੜ੒ͨ͠ίʔυΛTFSJBMJ[FS͔Βར༻ class PeopleController < ApplicationController def show @person = Person.find(params[:id]) render json: @person end end

Slide 27

Slide 27 text

©2018 Wantedly, Inc. $ curl 'http://localhost:3000/people/13' | jq . { "name": "Taro", "id": 13, "email": "[email protected]" }

Slide 28

Slide 28 text

©2018 Wantedly, Inc. QSPUPpMFͰهड़ͨ͠ +40/ΛฦͤΔʂ

Slide 29

Slide 29 text

©2018 Wantedly, Inc. w TFSWFSTJEFͷίʔυੜ੒ w DMJFOUTJEFͷίʔυੜ੒ QSPUPGJMF͔Βͷίʔυੜ੒

Slide 30

Slide 30 text

©2018 Wantedly, Inc. message Person { string name = 1; int32 id = 2; string email = 3; } module PersonAttributes extend ActiveSupport::Concern included do attribute :name attribute :id attribute :email end end QSPUPpMF SVCZ QSPUPGJMF͔ΒDMJFOUTJEFͷίʔυੜ੒ w NBQQJOHDMBTTͷίʔυΛੜ੒ʢTFSWFSͱಉ͡

Slide 31

Slide 31 text

©2018 Wantedly, Inc. QSPUPGJMF͔ΒDMJFOUTJEFͷίʔυੜ੒ class Models class Person < Base include Attributes::PersonAttributes end end w ੜ੒ͨ͠ίʔυΛNBQQJOHDMBTT͔Βར༻ w .PEFMT#BTFͱͯ͠ABUUSJCVUFAΛղऍ͢Δ࣮૷Λ༻ҙ w +40/ΛQBSTFͯ͠ɺσʔλΛอ࣋ɻϝιουͱͯ͠pFMEͷ஋ΛऔΓग़ͤΔ

Slide 32

Slide 32 text

©2018 Wantedly, Inc. [1] pry(main)> person = PeopleClient.get(13) I, … -- request: GET http://localhost:3000/people/13 . . . => [2] pry(main)> personn.name => “Taro"

Slide 33

Slide 33 text

©2018 Wantedly, Inc. QSPUPpMFͰهड़ͨ͠ +40/ΛQBSTFग़དྷΔDMJFOUʂ

Slide 34

Slide 34 text

©2018 Wantedly, Inc. QSPUPpMFͰ+40/"1*ͷTDIFNBΛ؅ཧ͠ɺ ͞Βʹίʔυੜ੒΋࣮ݱͰ͖ͨʂ

Slide 35

Slide 35 text

©2018 Wantedly, Inc. എܠ.JDSPTFSWJDFT"SDIJUFDUVSFͷ౷߹ٕज़ͱ ͯ͠ԿΛબͿ΂͖͔ ఏҊQSPUPpMFͰ3BJMT੡+40/"1*ͷ TDIFNBΛ؅ཧ͢Δ ·ͱΊ "HFOEB

Slide 36

Slide 36 text

©2018 Wantedly, Inc. w .JDSPTFSWJDFT"SDIJUFDUVSFͷԸܙΛड͚Δ ͨΊʹɺཧ૝తͳ౷߹ٕज़Λ࢖͍͍ͨ w ͦͷҝʹɺQSPUPpMFΛར༻ͯ͠+40/"1*ͷ TDIFNBΛهड़͠ɺ͞ΒʹTFSWFSɺDMJFOU࣮૷ ͷίʔυੜ੒Λߦͳͬͨʂ w ͳ͓ɺ࣮૷͕΋͏গ͠མͪண͍ͨΒɺ࢓૊ΈΛ044ͱͯ͠ެ։͢Δ༧ఆͰ͢ʢࠓ͸·ͩ 044ʹͳͬͯ·ͤΜɻɻɻʣ ·ͱΊ