Slide 1

Slide 1 text

© 2017 VASILY,Inc. 4XBHHFSͰఆٛͨ͠"1*࢓༷͔Β 3FUSPpUͰ࢖༻͢ΔJOUFSGBDFΛࣗಈੜ੒ͯ͠ΈΔ 2017/11/28 potatotips #45 @Horie1024

Slide 2

Slide 2 text

© 2017 VASILY,Inc. ࣗݾ঺հ w !)PSJF w 7"4*-: *OD w "OESPJEΤϯδχΞ w ϏʔϧɺࣗಈԽ޷͖

Slide 3

Slide 3 text

© 2017 VASILY,Inc. ೥݄;0;0508/΍8&"3ΛӡӦ͢Δ ελʔττΡσΠάϧʔϓʹࢀը ࢠձࣾԽ

Slide 4

Slide 4 text

© 2017 VASILY,Inc. ࠓ೔࿩͢͜ͱ w TXBHHFSQBSTFSΛ࢖͏ͱ4XBHHFSͰఆٛͨ͠"1* ࢓༷Λίʔυ͔Β؆୯ʹѻ͑Δ w LPMUJOQPFUͱ૊Έ߹ΘͤΔͱ3FUSPpUͰ࢖༻͢Δ EBUBDMBTT΍JOUFSGBDFͷίʔυΛੜ੒Ͱ͖Δ w (SBEMF1MVHJOԽ͢Δͱ௙Δ

Slide 5

Slide 5 text

© 2017 VASILY,Inc. Ϟνϕʔγϣϯ w σʔλ૚ͷίʔυΛࣗಈੜ੒͍ͨ͠

Slide 6

Slide 6 text

© 2017 VASILY,Inc. Ͳ͏࣮ݱ͢Δʁ w ฐࣾͷ"1*࢓༷͸4XBHHFSͰఆ͍ٛͯ͠Δ

Slide 7

Slide 7 text

© 2017 VASILY,Inc. Ͳ͏࣮ݱ͢Δʁ w ฐࣾͷ"1*࢓༷͸4XBHHFSͰఆ͍ٛͯ͠Δ w LPUMJOQPFUΛ࢖ͬͯΈ͍ͨ

Slide 8

Slide 8 text

© 2017 VASILY,Inc. Ͳ͏࣮ݱ͢Δʁ w ฐࣾͷ"1*࢓༷͸4XBHHFSͰఆ͍ٛͯ͠Δ w LPUMJOQPFUΛ࢖ͬͯΈ͍ͨ w 4XBHHFSͰఆٛͨ͠"1*࢓༷͔Βੜ੒͠Α͏ʂ

Slide 9

Slide 9 text

© 2017 VASILY,Inc. 4XBHHFSͰఆٛͨ͠"1*࢓༷ͷύʔε w TXBHHFSBQJTXBHHFSQBSTFSΛ࢖͏ͱ؆୯ w TXBHHFSKTPOΛಡΈࠐ·ͤΔඞཁ͕͋Δ w ϩʔΧϧͰ΋αʔό্ͷ΋ͷͰ΋0, // SwaggerΦϒδΣΫτ͔ΒAPI࢓༷ʹΞΫηε val swagger: Swagger = SwaggerParser().read(“swagger.json”)

Slide 10

Slide 10 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ w TRVBSFLPUMJOQPFUͰੜ੒ w 4XBHHFSΦϒδΣΫτ͔Βඞཁͳ৘ใΛऔಘ w LPUMJOQPFUͰίʔυੜ੒ w ೚ҙͷύεʹॻ͖ग़͠

Slide 11

Slide 11 text

© 2017 VASILY,Inc. ྫ(JU)VC"1*-JTUVTFSSFQPTJUPSJFT

Slide 12

Slide 12 text

© 2017 VASILY,Inc. 4XBHHFSͰ"1*࢓༷Λఆٛ "paths": { "/users/{username}/repos": { "get": { "summary": "List public repositories for the specified user.", "operationId": "listRepos", "parameters": [ { "name": "username", "in": "path", "description": "ID of pet to update", "required": true, "type": "string" }, { "name": "type", "in": "query", "description": "Can be one of all, owner, member. Default: owner", "required": false, "type": "string" }, { "name": "sort", "in": "query", "description": "Can be one of created, updated, pushed, full_name. Default: full_name", "required": false, "type": "string" }, { "name": "direction", "in": "query", "description": "Can be one of asc or desc. Default: when using full_name: asc, otherwise desc", "required": false, "type": "string" } ], "tags": [ "Users" ], "responses": { "200": { "description": "successful operation", "schema": { "type": "array", "items": { "$ref": "#/definitions/Repo" } } }, "400": { "description": "Invalid status value" } } } } }

Slide 13

Slide 13 text

© 2017 VASILY,Inc. w ͜Μͳײ͡ͷίʔυΛੜ੒͍ͨ͠ w 4XBHHFSΦϒδΣΫτ͔Βඞཁͳ৘ใΛऔಘ w LPUMJOQPFUͰίʔυੜ੒ w ೚ҙͷύεʹॻ͖ग़͠ LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> }

Slide 14

Slide 14 text

© 2017 VASILY,Inc. ྫ6TFS4FSWJDFJOUFSGBDFͷੜ੒ FileSpec.builder("", "UserService") .addType(TypeSpec .interfaceBuilder("UserService") .addFunction(FunSpec.builder("listRepos") .addModifiers(KModifier.ABSTRACT).build() ).build() ).build() interface UsersService { fun listRepos() }

Slide 15

Slide 15 text

© 2017 VASILY,Inc. ྫ6TFS4FSWJDFJOUFSGBDFͷੜ੒ FileSpec.builder("", "UserService") .addType(TypeSpec .interfaceBuilder("UserService") .addFunction(FunSpec.builder("listRepos") .addModifiers(KModifier.ABSTRACT) .addAnnotation(AnnotationSpec.builder(GET::class) .addMember("\"/users/{username}/repos\"") .build()).build() ).build() ).build().writeTo(System.out) interface UserService { @GET("/users/{username}/repos") fun listRepos() }

Slide 16

Slide 16 text

© 2017 VASILY,Inc. ྫ6TFS4FSWJDFJOUFSGBDFͷੜ੒ FileSpec.builder("", "UserService") .addType(TypeSpec .interfaceBuilder("UserService") .addFunction(FunSpec.builder("listRepos") .addModifiers(KModifier.ABSTRACT) .addAnnotation(AnnotationSpec.builder(GET::class) .addMember("\"/users/{username}/repos\"") .build()) .returns(ParameterizedTypeName.get(Single::class.asTypeName(), ParameterizedTypeName.get(List::class.asTypeName(), ClassName("", "Repo")) )).build() ).build() ).build() interface UserService { @GET("/users/{username}/repos") fun listRepos(): Single> }

Slide 17

Slide 17 text

© 2017 VASILY,Inc. ྫ6TFS4FSWJDFJOUFSGBDFͷੜ੒ FileSpec.builder("", "UserService") .addType(TypeSpec .interfaceBuilder("UserService") .addFunction(FunSpec.builder("listRepos") .addModifiers(KModifier.ABSTRACT) .addAnnotation(AnnotationSpec.builder(GET::class) .addMember("\"/users/{username}/repos\"") .build()) .addParameter(ParameterSpec.builder("username", String::class.asTypeName().asNonNullable()) .addAnnotation(AnnotationSpec.builder(Path::class).addMember("\"username\"").build()) .build()) .returns(ParameterizedTypeName.get(Single::class.asTypeName(), ParameterizedTypeName.get(List::class.asTypeName(), ClassName("", "Repo")) )).build() ).build() ).build() interface UserService { @GET("/users/{username}/repos") fun listRepos(@Path("username") username: String): Single> }

Slide 18

Slide 18 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> } "paths": { "/users/{username}/repos": { "get": { "operationId": "listRepos", "parameters": [ { "name": "username", "in": "path", "description": "ID of pet to update", "required": true, "type": "string" }, { "name": "type", "in": "query", "required": false, "type": "string" }, { "name": "sort", "in": "query", "required": false, "type": "string" }, { "name": "direction", "in": "query", "required": false, "type": "string" } ], "tags": [ "Users" ],

Slide 19

Slide 19 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> } "paths": { "/users/{username}/repos": { "get": { "operationId": "listRepos", "parameters": [ { "name": "username", "in": "path", "description": "ID of pet to update", "required": true, "type": "string" }, { "name": "type", "in": "query", "required": false, "type": "string" }, { "name": "sort", "in": "query", "required": false, "type": "string" }, { "name": "direction", "in": "query", "required": false, "type": "string" } ], "tags": [ "Users" ],

Slide 20

Slide 20 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> } "paths": { "/users/{username}/repos": { "get": { "operationId": "listRepos", "parameters": [ { "name": "username", "in": "path", "description": "ID of pet to update", "required": true, "type": "string" }, { "name": "type", "in": "query", "required": false, "type": "string" }, { "name": "sort", "in": "query", "required": false, "type": "string" }, { "name": "direction", "in": "query", "required": false, "type": "string" } ], "tags": [ "Users" ],

Slide 21

Slide 21 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> } "paths": { "/users/{username}/repos": { "get": { "operationId": "listRepos", "parameters": [ { "name": "username", "in": "path", "description": "ID of pet to update", "required": true, "type": "string" }, { "name": "type", "in": "query", "required": false, "type": "string" }, { "name": "sort", "in": "query", "required": false, "type": "string" }, { "name": "direction", "in": "query", "required": false, "type": "string" } ], "tags": [ "Users" ],

Slide 22

Slide 22 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> } "paths": { "/users/{username}/repos": { "get": { "operationId": "listRepos", "parameters": [ { "name": "username", "in": "path", "description": "ID of pet to update", "required": true, "type": "string" }, { "name": "type", "in": "query", "required": false, "type": "string" }, { "name": "sort", "in": "query", "required": false, "type": "string" }, { "name": "direction", "in": "query", "required": false, "type": "string" } ], "tags": [ "Users" ],

Slide 23

Slide 23 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> } "responses": { "200": { "description": "successful operation", "schema": { "type": "array", "items": { "$ref": "#/definitions/Repo" } } }, "400": { "description": "Invalid status value" } } } } }, "definitions": { "Repo": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "url": { "type": "string" } } } }

Slide 24

Slide 24 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ interface UsersService { @GET("/users/{username}/repos") fun listRepos( @Path("username") username: String, @Query("type") type: String? = null, @Query("sort") sort: String? = null, @Query("direction") direction: String? = null ): Single> } "responses": { "200": { "description": "successful operation", "schema": { "type": "array", "items": { "$ref": "#/definitions/Repo" } } }, "400": { "description": "Invalid status value" } } } } }, "definitions": { "Repo": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "url": { "type": "string" } } } }

Slide 25

Slide 25 text

© 2017 VASILY,Inc. LPUMJOQPFUͰͷίʔυੜ੒ data class Repo( val id: String, val name: String, val url: String ) "responses": { "200": { "description": "successful operation", "schema": { "type": "array", "items": { "$ref": "#/definitions/Repo" } } }, "400": { "description": "Invalid status value" } } } } }, "definitions": { "Repo": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "url": { "type": "string" } } } }

Slide 26

Slide 26 text

© 2017 VASILY,Inc. (SBEMF1MVHJOԽ w ͪ͜ΒͷϖʔδΛࢀߟʹ,PUMJOͰ࣮૷ w IUUQTXXXUIFESPJETPOSPJETDPNCMPH IPXUPDSFBUFHSBEMFQMVHJOJOLPUMJO w ɹɹɹɹɹɹɹɹɹɹɹͰੜ੒Λ࣮ߦ ./gradlew generateDataLayer

Slide 27

Slide 27 text

© 2017 VASILY,Inc. σϞ

Slide 28

Slide 28 text

© 2017 VASILY,Inc. ·ͱΊ w TXBHHFSQBSTFSΛ࢖͏ͱ4XBHHFSͰఆٛͨ͠"1* ࢓༷Λίʔυ͔Β؆୯ʹѻ͑Δ w LPUMJOQPFUΛ࢖͏ͱ,PMUJOͷίʔυΛ؆୯ʹੜ੒Ͱ ͖Δ w (SBEMF1MVHJO΋,PUMJOͰॻָ͚͍ͯ͠

Slide 29

Slide 29 text

© 2017 VASILY,Inc. ͋Γ͕ͱ͏͍͟͝·ͨ͠