Slide 1

Slide 1 text

Swi + JSON-RPC ishkawa

Slide 2

Slide 2 text

ishkawa?

Slide 3

Slide 3 text

JSON-RPC?

Slide 4

Slide 4 text

JSON-RPC is a stateless, light-weight remote procedure call (RPC) protocol.

Slide 5

Slide 5 text

HTTP body のJSON でリクエストを記述する 1 回の通信で複数のリクエストを実行できる

Slide 6

Slide 6 text

何に使うの?

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

タイムラインの投稿を取得する タイムラインの座標を住所に変換する バナー を取得する

Slide 9

Slide 9 text

GET /home ?

Slide 10

Slide 10 text

複数の処理をまとめたAPI は仕様が壊れやすい

Slide 11

Slide 11 text

JSON-RPC Batch

Slide 12

Slide 12 text

個々 の処理をメソッドとして定義 クライアント側で1 つのリクエストにまとめる 情報の組み合わせの変更に強い

Slide 13

Slide 13 text

Request [ { " i d " : " X X X X X X X X - X X X X - X X X X - X X X X - X X X X X X X X X X X X - X " , " j s o n r p c " : " 2 . 0 " , " m e t h o d " : " G e t T i m e l i n e O f f e r s " , " p a r a m s " : { . . . } } , { " i d " : " X X X X X X X X - X X X X - X X X X - X X X X - X X X X X X X X X X X X - X " , " j s o n r p c " : " 2 . 0 " , " m e t h o d " : " G e t B a n n e r s " , " p a r a m s " : { . . . } } ]

Slide 14

Slide 14 text

Response [ { " i d " : " X X X X X X X X - X X X X - X X X X - X X X X - X X X X X X X X X X X X - X " , " j s o n r p c " : " 2 . 0 " , " r e s u l t " : { . . . } } , { " i d " : " X X X X X X X X - X X X X - X X X X - X X X X - X X X X X X X X X X X X - X " , " j s o n r p c " : " 2 . 0 " , " r e s u l t " : { . . . } } ]

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Swi でどう表現する?

Slide 17

Slide 17 text

APIKit の仕組みに乗ろう

Slide 18

Slide 18 text

リクエストの型が決まればレスポンスの型も決まる l e t r e q u e s t = S o m e R e q u e s t ( ) l e t r e s p o n s e = S e s s i o n . r x _ r e s p o n s e ( r e q u e s t ) / / r e s p o n s e の型はO b s e r v a b l e < S o m e R e q u e s t . R e s p o n s e >

Slide 19

Slide 19 text

複数のリクエストに拡張しよう

Slide 20

Slide 20 text

l e t r e q u e s t A = R e q u e s t A ( ) l e t r e q u e s t B = R e q u e s t B ( ) l e t r e s p o n s e = S e s s i o n . r x _ r e s p o n s e ( r e q u e s t A , r e q u e s t B ) / / r e s p o n s e の型はO b s e r v a b l e < ( R e q u e s t A . R e s p o n s e , R e q u e s t B . R e s p o n s e ) >

Slide 21

Slide 21 text

タプルの要素数は? S e s s i o n . r x _ r e s p o n s e ( r e q u e s t A , r e q u e s t B ) S e s s i o n . r x _ r e s p o n s e ( r e q u e s t A , r e q u e s t B , r e q u e s t C ) S e s s i o n . r x _ r e s p o n s e ( r e q u e s t A , r e q u e s t B , r e q u e s t C , r e q u e s t D )

Slide 22

Slide 22 text

筋肉で解決

Slide 23

Slide 23 text

/ / a p p l e / s w i f t における筋肉の活躍 f u n c = = < A : E q u a t a b l e , B : E q u a t a b l e > ( l h s : ( A , B ) , r h s : ( A , B ) ) - > B o o l f u n c = = < A : E q u a t a b l e , B : E q u a t a b l e , C : E q u a t a b l e > ( l h s : ( A , B , C ) , r h s : ( f u n c = = < A : E q u a t a b l e , B : E q u a t a b l e , C : E q u a t a b l e , D : E q u a t a b l e > ( l h s : ( A , B , C f u n c = = < A : E q u a t a b l e , B : E q u a t a b l e , C : E q u a t a b l e , D : E q u a t a b l e , E : E q u a t a b l e > f u n c = = < A : E q u a t a b l e , B : E q u a t a b l e , C : E q u a t a b l e , D : E q u a t a b l e , E : E q u a t a b l e ,

Slide 24

Slide 24 text

e x t e n s i o n S e s s i o n { f u n c r x _ r e s p o n s e < R e q u e s t A : R P C R e q u e s t , R e q u e s t B : R P C R e q u e s t > ( r e q u e s t A : R e q u e s t A , r e q u e s t B : R e q u e s t B ) - > O b s e r v a b l e < ( R e q u e s t A . R e s p o n s e , R e q u e s t B . R e s p o n s e ) > { . . . } f u n c r x _ r e s p o n s e < R e q u e s t A : R P C R e q u e s t , R e q u e s t B : R P C R e q u e s t , R e q u e s t C : R P C R e q u e s t > ( r e q u e s t A : R e q u e s t A , r e q u e s t B : R e q u e s t B , r e q u e s t C : R e q u e s t C ) - > O b s e r v a b l e < ( R e q u e s t A . R e s p o n s e , R e q u e s t B . R e s p o n s e , R e q u e s t C . R e s p o n s e . . . } }

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

l e t b a n n e r R e q u e s t = B a n n e r R e q u e s t ( ) l e t t i m e l i n e R e q u e s t = T i m e l i n e R e q u e s t ( ) / / O b s e r v a b l e < ( B a n n e r R e q u e s t . R e s p o n s e , T i m e l i n e R e q u e s t . R e s p o n s e ) > l e t b a t c h R e s p o n s e = S e s s i o n . r x _ r e s p o n s e ( b a n n e r R e q u e s t , t i m e l i n e R e q u e s t ) . s h a r e R e p l a y ( 1 )

Slide 27

Slide 27 text

b a t c h R e s p o n s e . m a p { b a n n e r R e s p o n s e , t i m e l i n e R e s p o n s e i n r e t u r n b a n n e r R e s p o n s e . b a n n e r } . b i n d T o ( b a n n e r ) . a d d D i s p o s a b l e T o ( d i s p o s e B a g ) b a t c h R e s p o n s e . m a p { b a n n e r R e s p o n s e , t i m e l i n e R e s p o n s e i n r e t u r n t i m e l i n e R e s p o n s e . o f f e r s } . b i n d T o ( o f f e r s ) . a d d D i s p o s a b l e T o ( d i s p o s e B a g )

Slide 28

Slide 28 text

b a t c h R e s p o n s e . m a p { $ 0 . 0 . b a n n e r } . b i n d T o ( b a n n e r ) . a d d D i s p o s a b l e T o ( d i s p o s e B a g ) b a t c h R e s p o n s e . m a p { $ 0 . 1 . o f f e r s } . b i n d T o ( o f f e r s ) . a d d D i s p o s a b l e T o ( d i s p o s e B a g )

Slide 29

Slide 29 text

まとめ

Slide 30

Slide 30 text

JSON-RPC は複数のリクエストを1 個にまとめられる APIKit の考え方はJSON-RPC Batch にも適用できる (A, B) -> Observable<(A.Response, B.Response)> 筋肉をつけよう