Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
YAPC::Fukuoka 2017 HAKATA
Search
Takatsugu Shigeta
July 01, 2017
0
1.1k
YAPC::Fukuoka 2017 HAKATA
Web API の未来について GraphQL のことをお話ししました。
Takatsugu Shigeta
July 01, 2017
Tweet
Share
More Decks by Takatsugu Shigeta
See All by Takatsugu Shigeta
Contributing to open source products
comewalk
0
780
MTDDC Meetup KYUSHU 2013
comewalk
1
1.1k
Featured
See All Featured
Building Applications with DynamoDB
mza
91
6.1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
48
2.2k
Facilitating Awesome Meetings
lara
50
6.1k
Writing Fast Ruby
sferik
628
61k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
Docker and Python
trallard
41
3.1k
Speed Design
sergeychernyshev
25
670
Product Roadmaps are Hard
iamctodd
PRO
49
11k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
Transcript
{ talk(title: "Web API の未来") { title event speaker keywords
} }
{ "talk": { "title": "Web API の未来", "event": "YAPC::Fukuoka 2017",
"speaker": "Takatsugu Shigeta", "keywords": ["API", "GraphQL"] } }
{ speaker(name: "Shigeta") { name elsewhere work } }
{ "speaker": { "name": "シゲタタカツグ", "elsewhere": { "PAUSE": "SHIGETA", "Twitter":
"@comewalk", "GitHub": "@comewalk", "Blog": "https://blog.comewalk.com/" }, "work": { "at": "Six Apart Ltd.", "information": "We are hiring!" } } }
Web API の未来 について考える
https://trends.google.co.jp/trends/explore?date=all&q=Web%20API,REST%20API
Web API の歴史を遡る ※諸説あります Photo by https://flic.kr/p/8iSBWB
REST + JSON • 2010年年頃から現在の主流 • ブラウザとの親和性
REST + XML • 2005年年 Ajax の登場 • 2005年年 REST
ムーブメント • ブラウザの時代へ
XML-RPC • 1999年年頃 仕様策定 • RPC を HTTP の上で⾏行行うプロトコルのひとつ •
Firewall を越えてインターネットワイドに • 2001年年頃 SOAP 誕⽣生
RPC • Remote Procedure Call • ネットワーク越しに関数呼び出しするという意味で は Web API
の原点にある(と思う) • 独⾃自ポートを開けるなど Firewall を越える課題など
RPC XML-RPC REST + XML REST + JSON 2000年年 2005年年
2010年年 2015年年
サーバサイド • 独⾃自サーバから Web サーバへ • インターナルからインターネットへ • 独⾃自フォーマットから JSON
へ
クライアントサイド • 専⽤用プログラムからブラウザへ • C⾔言語などから JavaScript へ • 単純なマークアップ(HTML)から SPA
へ
REST の功罪 Photo by https://flic.kr/p/ogSP8K
REST によって HTTP の表現だけでリソースごとのシ ンプルなアクセスが提供できた⼀一⽅方で、⼤大量量のリソー スを抱えるサービスは多くのエンドポイントを持つた め、複数リソースからデータの取得が必要な場合に複 数回の API コールを余儀なくされる結果、主にクラ
イアントサイドのオーバヘッドが増え、⾮非同期処理理や ローカルキャッシュなどの技術を駆使することによる 実装の複雑化を増幅した結果、サーバサイド以上にク ライアントサイドは⾼高度な技術を要求されることとなっ た。
http://graphql.org/
– GraphQL Tokyo https://www.meetup.com/ja-JP/GraphQL-Tokyo/events/239924595/ “Meetup #1 Thinking in GraphQL”
– POSTD http://postd.cc/api-paradigms/ “GraphQLはWeb APIの次のフロンティアか?”
GraphQL • 2012年年 Facebook 開発 • 2015年年 Working Draft 公開
• http://graphql.org/
• プロトコル • アーキテクチャ • ソフトウェア • クエリー⾔言語 GraphQL
type Talk { title: String event: String speaker: String keywords:
[String] } type Query { talk(title: String): Talk }
type Talk { title: String! event: String! speaker: String! keywords:
[String] } type Root { talk(title: String): Talk } schema { query: Root }
{ talk(title: "Web API の未来") { title event speaker keywords
} }
{ "data": { "talk": { "title": "Web API の未来", "event":
"YAPC::Fukuoka 2017", "speaker": "Takatsugu Shigeta", "keywords": ["API", "GraphQL"] } } }
Request { talk(title: "Foo") { title event speaker keywords }
} Response { "data": { "talk": { "title": "Foo", "event": "YAPC::Fukuo "speaker": "Mike Jone "keywords": ["Alice", } } }
$ curl -s\ > -H 'Content-Type: application/json'\ > -H 'Authorization:
Bearer ...YOUR TOKEN…'\ > -d '{ "query": "{ viewer { login } }" }'\ > https://api.github.com/graphql | jq . { "data": { "viewer": { "login": "comewalk" } } } JSON でリクエスト
struct Talk { char* title; char* event; char* speaker; char*
keywords; }; struct Talk t; talk("Foo", &t); printf("%s", t->title); // "Foo" RPC の時代に似てますね! (20年年以上のあいだ、形を変えてもやっていることは同じ)
操作(Operations) • Query (データ問い合わせ) • Mutation (データ操作) • Subscription (データ更更新通知)
Query (データ問い合わせ) type UserQuery { search(name: String): [User] } schema
{ query: UserQuery } type Query { search(name: String): [User] }
Query (データ問い合わせ) Request query { search(name: "Foo") { name email
} } Response { "data": { [{ "name": "Bob", "email": "
[email protected]
" }] } }
Mutation (データ操作) type UserMutation { update(name: String): Int } schema
{ muration: UserMutation } type Mutation { update(name: String): Int }
Mutation (データ操作) Request mutation { update(name: "Foo") { result }
} Response { "data": { 1 } }
Subscription (データ更更新通知)
–GitHub https://developer.github.com/early-access/graphql/ https://developer.github.com/v4/ “The ability to define and specify precisely
the data you want for your integration is a powerful advantage over the existing REST endpoints. ” 事例例: GitHub
–Facebook https://facebook.github.io/relay/ “A JavaScript framework for building data- driven React
applications” 事例例: Relay
クライアント アプリケーション サーバ • 構⽂文解析 • 結果返却 GraphQL
クライアント アプリケーション サーバ GraphQL Proxy • 構⽂文解析 • データ収集 •
結果返却 GraphQL REST
クライアント アプリケーション サーバ GraphQL Proxy • 構⽂文解析 • データ収集 •
結果返却 GraphQL REST 外部Webサービス DBサーバ
–Netflix http://netflix.github.io/falcor/starter/what-is-falcor.html “Falcor is middleware.〜 Falcor can be used to
optimize communication between the layers of a new or existing application.” Falcor
https://netflix.github.io/falcor/documentation/network-diagram.png
Web API の未来 • Facebook, Netflix, GitHub など⼤大⼿手が動き始めた • GitHub
API は v3 が REST、v4 が GraphQL • REST が GraphQL に置き換わることは当⾯面ないと思う • だけど(ほぼ)5年年周期で変わるトレンドのはじまり • フォーマットは JSON • REST 原理理主義は卒業してもいい • きっと次に⽣生まれる何かが Web API の未来を担う
"phrase": { "text": "One more thing..." }
"CPAN": { "module": { "name": "GraphQL", "author": "SHIGETA" } }
"CPAN": { "module": { "name": "GraphQL", "author": "SHIGETA" => "ETJ"
} }
"CPAN": { "module": { "name": "GraphQL::Tiny", "author": "SHIGETA" } }
#!/usr/bin/perl use common::sense; use GraphQL::Tiny; use JSON; my $result =
GraphQL::Tiny->new( schema => <<'SCHEMA', type Query { hello: String bye: String } SCHEMA source => '{ hello }', root_value => { hello => sub { return 'Fukuoka'; } }, )->run(); say JSON->new->encode($result); $ perl hello.pl { "data": { "hello": "Fukuoka" } }
"links":[{ "rel": "self", "title": "Happy coding!", }, { "rel": "next",
"title": "Any Question?", "href": "@comewalk" }]