AFTER RubyKaigi 2019での発表資料です https://raksul.connpass.com/event/125165/
Q&A for How to use OpenAPI3for API developerAFTER RubyKaigi 2019ota42y
View Slide
about me
about me• @ota42y• ϔϧεςοΫΧϯύχʔͷαʔόαΠυΤϯδχΞ• ϚΠΫϩαʔϏεΑΖͣຊΈ͍ͨͳͷΛग़ͯ͠·͢• ిࢠ൛͋ΔΑ(ƅ㱼ƅ)oኯƅ• https://ota42y.booth.pm/items/1316740• https://ota42y.booth.pm/items/1316130
Today’s topic• OpenAPI3ͷൃදͷ͓͞Β͍• دͤΒΕ࣭ͨͱճ
OpenAPI3ͷൃදͷ͓͞Β͍
OpenAPI3• ϓϩάϥϛϯάݴޠʹґଘ͠ͳ͍REST APIͷͨΊͷఆٛ• ͔ͭͯSwaggerͱݺΕ͍ͯͯɺͦΕͷ࣍όʔδϣϯ• ϚγʔϯϦʔμϒϧͳYAML/JSONͷϧʔϧͰɺυΩϡϝϯτੜόϦσʔγϣϯɺϞοΫαʔόϥΠϒϥϦੜͳͲԠ༻ଟhttps://www.openapis.org/
APIͷఆٛͷॏཁੑ• େྔʹAPI͕͋Δ߹ɺυΩϡϝϯτ͕ॏཁʹͳΔ (ϚΠΫϩαʔϏεͩͱ1000ݸҎ্API͕͋ͬͨΓ͢Δ)• εΩʔϚϑΝʔετ։ൃ͢Δ߹ɺΠϯλϑΣʔεΛ͖ͬͪΓఆٛ͢Δඞཁ͕͋Δ• εΩʔϚϑΝʔετ։ൃʹ͍ͭͯৄͬͪ͘͜͠Reference:RubyKaigi 2017 API Development in 2017 https://www.youtube.com/watch?v=a28jJ62ZfZMRails Developers Meetup 2019: https://speakerdeck.com/aeroastro/rails-meets-protocol-buffers-for-schema-first-development
ਓͷखʹΑΔԹ͔Έͷ͋Δఆ่ٛΕΔ• ࣮ͱఆ͕ٛҰக͍ͯ͠Δͷ͕େલఏ• ͣΕΔͱఆ͕ٛ৴པͰ͖ͳ͘ͳΔ• ྗͰҰகͤ͞Δͷແཧ
OpenAPI 3ʹΑΔࣗಈνΣοΫ• OpenAPI 3ϚγʔϯϦʔμϒϧͳఆٛ• ఆٛͱͷζϨΛϓϩάϥϜͰνΣοΫͰ͖Δ• committee• rackͰrequest/response͕ఆٛͲ͓Γ͔ΛνΣοΫ͢Δgem• ఆٛ௨Γͷ࣮Ͱ͋ΔͱอূͰ͖Δ
Example APIget "/apps" docontent_type :json# page should be Integerpage = params["page"][page, (page*10)].map(&:to_s).to_jsonend
Example APIopenapi: 3.0.0info:title: Sample APIversion: 0.1.0paths:"/apps":get:parameters:- name: pagein: queryrequired: trueschema:type: integerresponses:'200':description: examplecontent:'application/json':schema:type: arrayitems:type: string
ͦͷଞͷOpenAPI 3ͷ׆༻• OpenAPI Generator• client libraryΛੜ͢Δπʔϧ• Swagger Editor• OpenAPI 3ͷఆٛΛॻ͘ΠϯλϥΫςΟϒͳΤσΟλ• ࣮ࡍʹαʔόʹϦΫΤετΛΕΔυΩϡϝϯτΛॻ͚Δ• ଞʹProtocol BuffersΛੜͨ͠Γͱ͔৭ʑ…ৄ͘͠ https://openapi.tools/
Q&A for How to use OpenAPI 3for API developer
Q.committeeຊ൪ڥͰͬͯΔ͔?• Yes• committeeܕͷύϥϝʔλΛม͢Δػೳ͕͋ΔͷͰrequestͰͬͯΔ (datetimeͳstringΛDateTimeΫϥεʹͨ͠ΓɺGETͩͱͯ͢stringʹͳΔͷͰIntegerʹ͢Δͱ͔)• ϦΫΤετʹ͔͠దԠ͞Εͳ͍ͨΊɺϨεϙϯεͷόϦσʔγϣϯͯ͠ͳ͍• ։ൃڥʹ͓͍ͯrequset/responseͷόϦσʔγϣϯΛೖΕ͍ͯΔ
Q.committee ΛೖΕͨ͜ͱʹΑΔӨڹ?• ϕϯνϚʔΫΛऔΓ·ͨ͠• https://gist.github.com/ota42y/1a5fb27e31aa5868af307fd66f52878b• ύϥϝʔλ͕1ݸͷখن• ύϥϝʔλ͕260ݸͷதن• ύϥϝʔλ͕2600ݸͷେن• ͦΕͧΕcommitteeͷON/OFFͰ10000ճܭଌ
committee ΛೖΕͨ͜ͱʹΑΔӨڹ?• responseʹؔͯ͠νΣοΫͯ͠ͳ͍• ࣮ͱͯ͠ڞ௨ͳͷͰ΄΅มΘΒͳ͍ͣ• ڥRuby 2.6.3ɺMac Book Pro, Core i5 2.7GHz
ίʔυ• https://gist.github.com/ota42y/1a5fb27e31aa5868af307fd66f52878b
VTFS TZTUFN UPUBM SFBM/PU6TF 6TF খن• 10000 times request time so 0.08 ms per request• So the committee doesn’t take 0.1 millisecond• The difference is very small
தن• Validate 260 objects by 0.16 milliseconds per request• But the difference is still small VTFS TZTUFN UPUBM SFBM/PU6TF 6TF
େن• Validate 2600 objects by 0.74 milliseconds per request• It’s very small difference VTFS TZTUFN UPUBM SFBM/PU6TF 6TF
A.ϕϯνϚʔΫ݁Ռ• தنύϥϝʔλͰେ͖ࠩ͘ग़ͯͳ͍• Mac Book ProڥͰ0.1ʙ2ms• Կແ͍࣌ͱͷࠩখ͍͞• ࣮ࡍͷαʔόͰ΄΅Өڹແ͍ͣ• requestʹ100ύϥϝʔλΔͷ͔ͳΓେ͖͍͜ͱΛߟ͑Δͱɺ΄΅ແࢹͰ͖Δͣ
Q. OpenAPI 3.0.1ͩͱಈ͔ͳ͍Μ͚ͩͲ• ͖ͬ͞͠·ͨ͠
Q. OpenAPI 3.0.1ͩͱಈ͔ͳ͍Μ͚ͩͲ• ϦϦʔεͯ͋͠Γ·͢㱬(ɾ8ɾ)⊃
ຊ൪͜͜Ͱ࣌ؒΕ
Q.GraphQL / gRPC ͱൺͯͲ͏Α• ͲΕ͕͍͍͔ϝϯόʔΫϥΠΞϯτଆͷ࣮ɺݴޠʹΑΔ• GraphQLಋೖ͚ͯͨ͠ͲΞϓϦଆͷ࣮ઓུʹ߹Θͣʹ׆༻Ͱ͖ͣɺ݁ہࣺͯͨ• gRPCRailsͩͱݱঢ়·ͩਏ͍ͱ͍͏ࣄ࣮• Go ͱ͔ͳΒ༗ྗͳબࢶ• ΫοΫύου͕ؤுͬͯΔ
ࠓͷੈքRESTʹ࠷దԽ͞ΕͯΔ• ΤίγεςϜͱ͔ݟREST͕ੌ͍• ͦͦRailsRESTͱੑ͕͍͍• GraphQL/gRPCΛೖΕΔͷ͍ͩͿΤωϧΪʔ͕ඞཁ• ಉ͡࿑ྗΛRESTͱGraphQL/gRPCͷͲΕʹׂ͘ͷ͕Ұ൪͔• ͔ͳΓޮՌతͳ໘͋ΔͷͰɺݟۃΊͱ֮ޛ