$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
Search
Kent OHASHI
February 05, 2024
Programming
0
160
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
インターフェース定義言語(IDL)に注目しながらREST, GraphQL, gRPCの基本を学ぼう!
Kent OHASHI
February 05, 2024
Tweet
Share
More Decks by Kent OHASHI
See All by Kent OHASHI
🐬の推し本紹介2025: 『コーディングを支える技術 ――成り立ちから学ぶプログラミング作法』
lagenorhynque
0
30
KotlinでミニマルなResult実装による関数型エラーハンドリング
lagenorhynque
0
19
Functional Calisthenics in Kotlin: Kotlinで「関数型エクササイズ」を実践しよう
lagenorhynque
0
160
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
lagenorhynque
1
120
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
lagenorhynque
1
160
From Scala/Clojure to Kotlin
lagenorhynque
0
68
TDD with RDD: Clojure/LispのREPLで変わる開発体験
lagenorhynque
0
93
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
lagenorhynque
1
130
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
lagenorhynque
0
98
Other Decks in Programming
See All in Programming
【CA.ai #3】Google ADKを活用したAI Agent開発と運用知見
harappa80
0
300
チームをチームにするEM
hitode909
0
300
配送計画の均等化機能を提供する取り組みについて(⽩⾦鉱業 Meetup Vol.21@六本⽊(数理最適化編))
izu_nori
0
150
React Native New Architecture 移行実践報告
taminif
1
150
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
370
ID管理機能開発の裏側 高速にSaaS連携を実現したチームのAI活用編
atzzcokek
0
210
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
1
220
AIコーディングエージェント(Gemini)
kondai24
0
200
AIコーディングエージェント(Manus)
kondai24
0
160
生成AIを利用するだけでなく、投資できる組織へ
pospome
0
250
ViewファーストなRailsアプリ開発のたのしさ
sugiwe
0
440
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
240
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
54k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Bash Introduction
62gerente
615
210k
The Pragmatic Product Professional
lauravandoore
37
7.1k
BBQ
matthewcrist
89
9.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
How to Ace a Technical Interview
jacobian
280
24k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
A better future with KSS
kneath
240
18k
[SF Ruby Conf 2025] Rails X
palkan
0
500
The Cult of Friendly URLs
andyhume
79
6.7k
Transcript
インターフェース定義言語から学ぶ モダンな Web API 方式 REST, GraphQL, gRPC 1
lagénorhynque 🐬カマイルカ (defprofile lagénorhynque :id @lagenorhynque :reading "/laʒenɔʁɛ̃k/" :aliases ["
カマイルカ" " 🐬"] :languages [Java Clojure Haskell Python 日本語 English français русский] :interests [ プログラミング 語学/ 言語学 数学 法/ 政治 財務/ 会計] :job-roles [ エンジニアリングマネージャー ソフトウェアアーキテクト] :motto " 楽しく楽にクールにスマートに" 2
私の仙台との接点 ( 仙台のイベント「タガヤス」ということで) 🐬は岐阜出身、千葉在住 2016 年4 月から ( 本社: 東京・市ヶ谷)
所属 2017 年からオプトの「仙台ラボラトリ」メンバー と合同で仕事することが増えた 2018 年春、2023 年春には仙台に出張する機会も 株式会社オプト 3
記事: サービス間連携のためのGraphQL API をClojure で開発している話 4
発表: at (2022-06-24) Java からScala 、そしてClojure へ: 実務で活きる 関数型プログラミング 【タガヤス
その26 】初心者歓迎!関数型プログラ ミングって何だろう? 5
Table of Contents 1. Web API のスキーマ駆動開発 2. 現代の主要なWeb API
方式 3. REST/GraphQL/gRPC のIDL 6
1. Web API のスキーマ駆動開発 7
スキーマ駆動開発 (schema-driven development) Web API のサーバとクライアントの間の「契約」で あるスキーマ(schema) を先行して定義し、それを 起点に実装を進める開発スタイル スキーマはインターフェース定義言語(inteface
definition/description language; IDL) で記述する 認識齟齬/ 不整合を避けて効率的に開発できる コード/ ドキュメント生成などの応用もしやすい a.k.a. スキーマファースト開発(schema-first development) 8
スキーマ駆動開発 ( サーバサイド ) の基本的な流れ 1. API の構想/ 方式設計 2.
API スキーマの( 初期) 設計 アウトプット: IDL ファイル 3. [optional] プロジェクト/ コードの自動生成 アウトプット: プロジェクトテンプレート/ スタ ブ/ 型定義コード 利用言語/ ライブラリ/ ツールに大きく依存する 4. API サーバ実装/ テスト ↺ API スキーマの拡張/ 修正 9
2. 現代の主要な Web API 方式 REST, GraphQL, gRPC 10
REST schema definition SDL (IDL) data format (text), etc. (text),
etc. (binary) notes (tools) query language (compiler) HTTP/2 GraphQL gRPC OpenAPI Specification GraphQL Protocol Buffers JSON JSON Protocol Buffer wire format Swagger protoc 11
REST (representational state transfer) 本質: プロトコルに寄り添ったWeb API の設計 パターン 具体的な形式は設計者によって揺れが大きい:
に基づいてYAML/JSON 形式 でスキーマを記述できる(de facto standard?) / の各種ツールでスキーマ編集/ 閲覧や動作確認、コード生成などができる e.g. ( ブラウザ版) HTTP Richardson Maturity Model OpenAPI Specification Swagger OpenAPI Swagger Editor 12
13
GraphQL 本質: クライアントに自由度を与えるWeb サービス のクエリ言語 cf. RDB に対するSQL ( 単純なREST
API で発生しやすい) オーバーフェッ チング/ アンダーフェッチングを回避できる Schema Definition Language (SDL) でス キーマを記述する というブラウザIDE でAPI コールを試す ことができる e.g. GitHub GraphQL API の クライアントはGraphQL のクエリ言語を用いて必 要最小限のデータのみを選択的に取得できる GraphQL GraphiQL Explorer 14
15
gRPC 本質: ベースの効率的なRPC (remote procedure call) のためのフレームワーク マイクロサービスアーキテクチャのバックエンド サービス間連携で有力な選択肢 Web
フロントエンド向けのAPI としても利用でき る: のIDL でスキーマを記述する (Protocol Buffers compiler) でサーバ/ ク ライアントのコード生成ができる ( バイナリ形式) でデー タを送受信する HTTP/2 grpc-web Protocol Buffers protoc Protocol Buffer wire format 16
17
3. REST/GraphQL/gRPC の IDL 18
インターフェース定義言語 (IDL) の記述 API style IDL REST OpenAPI Specification (.yaml,
.json) GraphQL GraphQL SDL (.graphql) gRPC Protocol Buffers (.proto) 19
題材 : 蔵書 / 読書管理サービス cf. , 主な機能 カタログの書籍情報のCRUD 本棚(
蔵書) の書籍の読書状況/ レビュー情報の CRUD ※ サンプルコード: ブクログ 読書メーター web-api-style-comparison 20
[REST] データモデル ( エンティティ ) の定義例 components > schemas >
Book: Book データ のJSON 仕様(cf. ) components: schemas: Book: title: Book type: object properties: id: type: integer description: 書籍ID minimum: 0 readOnly: true title: type: string description: 書名 # ...( 以下略)... JSON Schema 21
required: 必須のプロパティ example: データ例 required: - id - title -
author # ...( 以下略)... description: 書籍 example: id: 1 title: Web API の設計 author: '( 著) Arnaud Lauret, ( 翻訳) 株式会社クイープ, ( 監 修) 株式会社クイープ' publisher: 翔泳社 publication_date: '2020-08-26' official_site_url: 'https://www.shoeisha.co.jp/book/ detail/9784798167015' 22
[REST] 参照系操作の定義例 paths > /books > get: パス /books に対する
GET リクエスト paths: /books: get: tags: - book_catalog summary: 書籍の一覧取得 operationId: get-books description: 検索条件を満たす書籍をカタログから取得する。 23
parameters: パラメータの仕様 parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/page' -
schema: type: string minLength: 1 in: query name: title description: 書名 ( 部分一致) - schema: type: string minLength: 1 in: query # ...( 以下略)... 24
responses > '200': レスポンスステータスコー ド200 の場合 content > application/json: レスポンス
ボディのJSON 仕様 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Book' pagination: $ref: '#/components/schemas/Pagination' # ...( 以下略)... 25
[REST] 更新系操作の定義例 paths > /books > post: パス /books に対す
るPOST リクエスト paths: /books: post: tags: - book_catalog summary: 書籍の追加 operationId: post-books description: 書籍をカタログに追加する。 26
requestBody > content > application/json: リクエストボディのJSON 仕 様 requestBody: content:
application/json: schema: $ref: '#/components/schemas/Book' examples: example-1: value: title: Web API の設計 author: '( 著) Arnaud Lauret, ( 翻訳) 株式会社 クイープ, ( 監修) 株式会社クイープ' publisher: 翔泳社 publication_date: '2020-08-26' # ...( 以下略)... description: 書籍 27
responses > '201': レスポンスステータスコー ド201 の場合 headers > Location: レスポンスのLocation
ヘッダーの仕様 responses: '201': description: Created headers: Location: schema: type: string format: uri-reference example: /books/1 description: 追加された書籍へのURL 28
[GraphQL] データモデル ( エンティティ ) の定義例 Book データのオブジェクト型定義 T! はNon-Null
型( ただの T はnullable 型) """ 書籍""" type Book { """ 書籍ID""" id: ID! """ 書名""" title: String! """ 著者""" author: String! """ 出版社""" publisher: String! """ 出版年月日""" # ...( 中略)... """ レビューの集計結果""" reviewSummary: ReviewSummary! } 29
ReviewSummary, Review データのオブジェクト型 定義 [T] はList 型([T!], [T]!, [T!]! もある)
""" レビューの集計結果""" type ReviewSummary { """ 平均ランク""" averageRank: Float """ リスト""" reviews: [Review!]! } """ レビュー""" type Review { """ ランク ( 星の数1 〜5)""" rank: Int """ コメント""" comment: String } 30
[GraphQL] 参照系操作の定義例 booksInCatalog クエリ(Query 型フィールド) の定義 type Query { """
カタログの書籍の一覧取得""" booksInCatalog( """ 書名 ( 部分一致)""" title: String """ 著者 ( 部分一致)""" author: String """ 出版社 ( 部分一致)""" publisher: String """ 出版年月日 ( 始点)""" publishedOnFrom: Date """ 出版年月日 ( 終点)""" publishedOnTo: Date ): [Book!]! } 31
[GraphQL] 更新系操作の定義例 addBookToCatalog ミューテーション(Mutation 型 フィールド) の定義 type Mutation {
""" カタログへの書籍の追加""" addBookToCatalog( """ 追加内容""" input: AddBookToCatalogInput! ): AddBookToCatalogPayload } 32
addBookToCatalog ミューテーション用の入出力の 型定義 入力の型は input 、出力の型は type で定義す る input
AddBookToCatalogInput { """ 書名""" title: String! """ 著者""" author: String! """ 出版社""" publisher: String! """ 出版年月日""" # ...( 以下略)... } type AddBookToCatalogPayload { """ 追加された書籍""" book: Book! } 33
[gRPC] データモデル ( エンティティ ) の定義例 Book データのメッセージ型定義 = の右辺のフィールド番号でフィールドが識別さ
れる( ユニークに保ち、再利用しない) // 書籍 message Book { // 書籍ID int32 id = 1; // 書名 string title = 2; // 著者 string author = 3; // 出版社 string publisher = 4; // 出版年月日 /* ...( 中略)... */ // レビューの集計結果 ReviewSummary review_summary = 9; } 34
ReviewSummary, Review データのメッセージ型定 義 optional は省略可能フィールド repeated は0 個以上の繰り返しフィールド //
レビューの集計結果 message ReviewSummary { // 平均ランク optional float average_rank = 1; // リスト repeated Review reviews = 2; } // レビュー message Review { // ランク ( 星の数1 〜5) optional int32 rank = 1; // コメント optional string comment = 2; } 35
[gRPC] 参照系操作の定義例 BiblogApi サービスのListBooksInCatalog メソッド の定義 // 書籍管理サービス"Biblog" のgRPC API
service BiblogApi { // 書籍を一覧取得する rpc ListBooksInCatalog(ListBooksInCatalogRequest) returns ( ListBooksInCatalogResponse); } 36
ListBooksInCatalog メソッド用の入出力の型定義 message ListBooksInCatalogRequest { // 書名 ( 部分一致) optional
string title = 1; // 著者 ( 部分一致) optional string author = 2; // 出版社 ( 部分一致) optional string publisher = 3; // 出版年月日 ( 始点) /* ...( 以下略)... */ } message ListBooksInCatalogResponse { // 書籍のリスト repeated Book books = 1; } 37
[gRPC] 更新系操作の定義例 BiblogApi サービスのAddBookToCatalog メソッド の定義 // 書籍管理サービス"Biblog" のgRPC API
service BiblogApi { // 書籍を追加する rpc AddBookToCatalog(AddBookToCatalogRequest) returns (AddB ookToCatalogResponse); } 38
AddBookToCatalog メソッド用の入出力の型定義 message AddBookToCatalogRequest { // 書名 string title =
1; // 著者 string author = 2; // 出版社 string publisher = 3; // 出版年月日 /* ...( 以下略)... */ } message AddBookToCatalogResponse { // 追加された書籍 Book book = 1; } 39
XaaS 時代の Web サービスのインターフェース (API) REST 以外の方式も選択肢として検討しよう スキーマ駆動開発を実践しよう 内部実装だけでなく設計について学ぼう 40
Further Reading 公式ドキュメント OpenAPI Initiative Getting Started | OpenAPI Documentation
GraphQL | A query language for your API Introduction to GraphQL | GraphQL gRPC Introduction to gRPC | gRPC Overview | Protocol Buffers Documentation 41
(REST) API とその設計 『Web API の設計』 『Web API: The Good
Parts 』 『Web を支える技術 ―― HTTP ,URI ,HTML ,そ してREST 』 『API デザイン・パターン』 42
GraphQL, gRPC 『初めてのGraphQL ――Web サービスを作って学 ぶ新世代API 』 GraphQL in Action
How to GraphQL - The Fullstack Tutorial for GraphQL gRPC: Up and Running API 設計: gRPC 、OpenAPI 、REST の概要と、それ らを使用するタイミングを理解する | Google Cloud 公式ブログ 43
サンプルコード : REST API (Clojure) cf. : GraphQL API (Clojure)
cf. : gRPC API (Clojure) cf. lagenorhynque/web-api-style-comparison lagenorhynque/clj-rest-api 『3 つのLisp 3 つの世界』( 電子版) lagenorhynque/aqoursql Clojure のLacinia でGraphQL API 開発してみた lagenorhynque/route-guide Clojure のProtojure でgRPC API 開発してみた 44