Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
はてなサマーインターンシップ2025 Web API 講義資料
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hatena
October 14, 2025
Technology
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
はてなサマーインターンシップ2025 Web API 講義資料
https://hatena.co.jp/recruit/intern/2025
Hatena
October 14, 2025
More Decks by Hatena
See All by Hatena
Androiderを育成する「高速道路」と 実戦を経て辿り着いた現在地 / DroidKaigi 2026
hatena
0
200
60分で学ぶクラウドとSRE・サービス運用 / GeekCAMPAcademia 2026-05
hatena
1
140
エンジニアリング マネージャーの育成と評価軸の考え方
hatena
0
730
Perlブートキャンプ
hatena
0
5.7k
はてなサマーインターンシップ2025 フロントエンド 講義資料
hatena
21
11k
はてなサマーインターンシップ2025 コンテナ + Kubernetesハンズオン 講義資料
hatena
0
850
はてなサマーインターンシップ2025 クラウドと運用 講義資料
hatena
0
890
はてなサマーインターンシップ2025 RDBMSの基礎 講義資料
hatena
0
1k
はてなサマーインターンシップ2025 セキュリティ 講義資料
hatena
0
900
Other Decks in Technology
See All in Technology
OR学会2026年秋期大会_機械学習と数理最適化の融合による、配合レシピ最適化システム開発事例
brainpadpr
0
120
Deep Data Security 機能解説
oracle4engineer
PRO
2
770
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
350
事業活動を AI Ready にする攻めと守りのデータエンジニアリング / data-engineering-for-ai-ready-business
pei0804
7
2.5k
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
180
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
0
180
Execution in the Kingdom of Agents: Reflections on Abstraction and Complexity
bcantrill
0
940
AI時代のPRレビューにどう向き合うか?
kairim0
1
160
並行性の問題を防げ!実践トランザクション入門
occhi
0
280
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
3
690
子育てエンジニアの可処分時間が減っても成長を諦めない戦い方
sudoakiy
6
4.4k
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
0
300
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
480
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
580
Faster Mobile Websites
deanohume
310
32k
エンジニアに許された特別な時間の終わり
watany
109
250k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
470
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Between Models and Reality
mayunak
4
490
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
630
A Modern Web Designer's Workflow
chriscoyier
699
190k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
260
Transcript
Web API IBUFOBJOUFSO !
͜ͷߨٛͷత • Web API を⽀えるプロトコル (HTTP) について知る • Web API
の種類を知り、俯瞰できるようになる IBUFOBJOUFSO !
ϓϩτίϧ • = 約束ごと • TCP/IP, HTTP, DNS, TLS, SMTP,
3 • インターネットの参加者はプロトコルに従っている • サーバ(Google やはてな) • クライアント(ブラウザ、スマートフォンアプリ) • ルータ、… • これらのプロトコルは RFC によって定義される • = Request for Comments IBUFOBJOUFSO !
γϯλοΫεͱηϚϯςΟΫε • シンタックス(Syntax) • プロトコルの参加者が、どんなフォーマットでやりとりする か • セマンティクス(Semantics) • シンタックスに従ってやりとりされるデータをどう解釈する
か IBUFOBJOUFSO !
HTTP Hypertext Transfer Protocol IBUFOBJOUFSO !
Hypertext Transfer Protocol http://www.example.com/ • ハイパーテキスト • リンクしたり画像を埋め込んだりできるテキスト • HTML
によって表現されるもの • …のためのプロトコル IBUFOBJOUFSO !
HTTP ͷλΠϜϥΠϯ 1991 HTTP/%.' 1996 HTTP/%.' 1997 HTTP/%.% 2009 Google
が SPDY を発表 2013 Google が QUIC を発表 2015 SPDY を元にしたHTTP/%の 標準化 2018 HTTP-over-QUIC を HTTP/%に改名 2021 QUIC の標準化 2022 HTTP/% の標準化 IBUFOBJOUFSO !
HTTP/1.1: HTTP ͷجૅ • RFC &''(: HTTP Semantics • RFC
&''': HTTP Caching • RFC &''8: HTTP/'.' • Deprecated: • RFC 8(?@ Hypertext Transfer Protocol -- HTTP/'.' • RFC 8?'? Hypertext Transfer Protocol -- HTTP/'.' • RFC G8H( Hypertext Transfer Protocol (HTTP/'.'): Message Syntax and Routing • RFC G8H' Hypertext Transfer Protocol (HTTP/'.'): Semantics and Content • RFC G8H8 Hypertext Transfer Protocol (HTTP/'.'): Conditional Requests • RFC G8HH Hypertext Transfer Protocol (HTTP/'.'): Range Requests • RFC G8HN Hypertext Transfer Protocol (HTTP/'.'): Caching • RFC G8HO Hypertext Transfer Protocol (HTTP/'.'): Authentication IBUFOBJOUFSO !
Uniform Resource Locator (URL) • ブラウザで「開く」と… • HTTP(S) でリソースを取得する •
motemen.hatenablog.com の 443 ポート • /search?q=git • データ (HTML) を解釈して表⽰する IBUFOBJOUFSO !
ਓؒ HTTP/1.1 ΛͬͯΈΔ • http://hatena.blog/ へのアクセス $ nc hatena.blog 80
GET / HTTP/1.1 Host: hatena.blog ↵ IBUFOBJOUFSO !"
HTTP/1.1 301 Moved Permanently Server: CloudFront Date: Mon, 28 Jul
2025 03:00:19 GMT Content-Type: text/html Content-Length: 167 Connection: keep-alive Location: https://hatena.blog/ X-Cache: Redirect from cloudfront Via: 1.1 0813d806b3dfe883cf8cfb0f711fd4ec.cloudfront.net (CloudFront) X-Amz-Cf-Pop: KIX56-P3 X-Amz-Cf-Id: -uMcBBc0Hyr2nrpWSAJZ4p-4mA8RPrzgM-t6SOUejkivv_ekknmmLA== <html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>CloudFront</center> </body> </html> IBUFOBJOUFSO !!
HTTPS ͬͯΈΔ • HTTP over TLS • https://hatena.blog/ へのアクセス $
openssl s_client -connect hatena.blog:443 GET / HTTP/1.1 Host: hatena.blog ↵ IBUFOBJOUFSO !"
HTTP ͷεΠεΞʔϛʔφΠϑ: curl $ curl --head --location --verbose http://hatena.blog/ >
HEAD / HTTP/1.1 > Host: hatena.blog > User-Agent: curl/8.7.1 > Accept: */* > < HTTP/1.1 301 Moved Permanently ... curl --help all で楽しもう IBUFOBJOUFSO !"
HTTP ͷηϚϯςΟΫε • リクエスト • メソッドとターゲット • レスポンス • ステータス
• 共通 • ヘッダー • ボディ IBUFOBJOUFSO !"
HTTP/1.1 γϯλοΫε ϦΫΤετ <method> <target> HTTP/1.1 <field>: <value> <body> Ϩεϙϯε
HTTP/1.1 000 <reason> <field>: <value> <body> IBUFOBJOUFSO !"
ϦΫΤετߦ <method> <target> HTTP/1.1 GET POST PUT HEAD DELETE OPTIONS
TRACE CONNECT PATCH /entry/1 /search?q=text / HTTP/1.0 HTTP/1.1 IBUFOBJOUFSO !"
εςʔλεߦ HTTP/1.1 000 Reason • 1xx Informational • 2xx Successful
• 3xx Redirection • 4xx Client Error • 5xx Server Error IBUFOBJOUFSO !"
ϘσΟ HTML <!DOCTYPE html> <html lang="ja"> ... JSON { "id":
"42", "created": 1723707520, ... } PNG ը૾ ?PNG\0d\1a\00\00\00\0dIHDR... IBUFOBJOUFSO !"
ϔομʔ Host: hatena.blog Content-Type: text/html Content-Length: 167 Location: https://hatena.blog/ •
メッセージを拡張したり、メタデータとして機能したり IBUFOBJOUFSO !"
Content-Type • Content-Type: text/html — HTML • Content-Type: application/json —
JSON • Content-Type: image/png — PNG 画像 IBUFOBJOUFSO !"
ίϯςϯτωΰγΤʔγϣϯ 同じ URL へのアクセスでも… • Accept: text/html • リンク遷移など •
Accept: image/* • <img> 要素からのリクエストなど IBUFOBJOUFSO !"
ϘσΟͷѹॖ • クライアント Accept-Encoding: gzip, deflate • サーバ Content-Encoding: gzip
• gzip • compress • deflate • identity • br IBUFOBJOUFSO !!
ΫοΩʔ ! • サーバ Set-Cookie: key=value; Expires=Wed, 09 Jun 2024
10:18:14 GMT • クライアント Cookie: key=value • HTTP は本来ステートレス →「セッション」の導⼊ • ブラウザにクッキーを⾷べさせることで次回以降のリクエストに情 報を持ち越す IBUFOBJOUFSO !"
ೝূ ! Authorization: Basic xxxx Authorization: Bearer yyyy IBUFOBJOUFSO !"
Ωϟογϡ ! Cache-Control: public, max-age=14400 Cache-Control: private Vary: Accept-Encoding •
単体で RFC ができる程度には話題が多い • RFC 4555: HTTP Caching IBUFOBJOUFSO !"
HTTP/2 RFC %&'( Hypertext Transfer Protocol Version ; (HTTP/;) IBUFOBJOUFSO
!"
HTTP/1.1 ͷ • 背景: 複雑化する Web アプリケーション環境 • たくさんのアセット (JavaScript、画像、…)
• モバイル機器からのアクセス • リクエスト-レスポンスのやりとりが TCP コネクションを専有 • ドメインあたりのコネクションは 6 つほどに制限されている • 「重い」リクエストがあると次のリクエストができない • ヘッダーの冗⻑性 IBUFOBJOUFSO !"
IBUFOBJOUFSO !"
HTTP/2 • セマンティクスは HTTP//./ と共通 • バイナリフレームでやりとり • ひとつの TCP
コネクションを複数のストリームに分割 • 複数のリソースを⼀度にやり取りできる • 複雑な制御ができる • ヘッダーも圧縮 IBUFOBJOUFSO !"
HPACK RFC %&'( HPACK: Header Compression for HTTP/; Index Header
Name Header Value / :authority 0 :method GET 1 :method POST 2 :path / 3 :path /index.html 4 :scheme http 5 :scheme https 6 :status 200 IBUFOBJOUFSO !"
HTTP/3 • QUIC トランスポート • UDP 上に TCP と TLS
の機能を再現 • HTTP-over-QUIC • HTTP/B を QUIC トランスポート上で実装 • QPACK • コネクションマイグレーション $ open https://http3.is IBUFOBJOUFSO !"
HTTP • セマンティクス • HTTP/-.- • シンタックス • HTTP/2, HTTP/5
• モチベーション • 仕組み IBUFOBJOUFSO !"
API Application Programming Interface IBUFOBJOUFSO !!
Application Programming Interface • OS ⇔ アプリケーション • glibc: システムコール
• ブラウザ ⇔ JavaScript アプリケーション • DOM (Document Object Model): HTML ⽂書を JS から操作 • Web サービス ⇔ Web フロントエンド、アプリ、別システム • REST • GraphQL • gRPC IBUFOBJOUFSO !"
LSUDs (Large Set of Unknown Developers) • 最⼤公約数的な API を提供する
SSKDs (Small Set of Known Developers) • クライアントに最適化した API を提供する IBUFOBJOUFSO !"
API • REST • GraphQL • gRPC IBUFOBJOUFSO !"
REST Representational State Transfer • HTTP の仕組みをうまく使う • リソース指向 https://api.github.com/repos/hatena/example/issues/1
IBUFOBJOUFSO !"
CRUD HTTP メソッド Create POST Read GET Update PUT /
PATCH Delete DELETE IBUFOBJOUFSO !"
ྫ: GitHub ͷΠγϡʔίϝϯτ • POST /repos/:owner/:repo/issues/:issue_number/comments • GET /repos/:owner/:repo/issues/comments/:comment_id •
PATCH /repos/:owner/:repo/issues/comments/:comment_id • DELETE /repos/:owner/:repo/issues/comments/:comment_id IBUFOBJOUFSO !"
REST ͷΤϥʔϨεϙϯε • 厳密な制約はない • HTTP ステータスコードによる表現 • 例: レートリミットを超えた
→ 429 Too Many Requests • RFC TUVW: Problem Details • エラーレスポンスの形式を定める IBUFOBJOUFSO !"
OpenAPI • Swagger • REST API を記述するための仕様 • コード⽣成‧ドキュメント⽣成にも使える •
例: https://github.com/openai/openai-openapi IBUFOBJOUFSO !"
REST API ͷόʔδϣχϯά • path にバージョン番号を⼊れる • 例: X (旧
Twitter) • GET /A.A/statuses/show/:id • GET /G/tweets/:id IBUFOBJOUFSO !"
REST ͷಛ • 実装や原則がシンプル • 道具なく作りはじめられる • REST「⾵」になりがちではある • Accidentally
RESTful という表現もある • クライアント側から使いにくくなりがち • オーバーフェッチ、アンダーフェッチ • 要求の変化への対応が難しくなりがち IBUFOBJOUFSO !"
API • REST • GraphQL • gRPC IBUFOBJOUFSO !!
GraphQL • Facebook (現 Meta) によって開発された • クライアント側から必要なフィールドを指定する • スキーマからのコード⽣成ができる
IBUFOBJOUFSO !"
SDL (Schema Definition Language) type Query { blog(id: String!): Blog
} type Blog { title: String! entries(first: Int!): [Entry!]! } type Entry { title: String! body: String! name: String @deprecated(reason: "Use `title`.") } IBUFOBJOUFSO !"
εΧϥʔܕ Int Float String Boolean ID 独⾃のスカラー型を定義することもできる IBUFOBJOUFSO !"
ΦϒδΣΫτܕ type Blog { title: String! entries(first: Int!): [Entry!]! }
! がつくと non-nullable [T] はリスト型 IBUFOBJOUFSO !"
interface interface Publication { body: String! } type Entry implements
Publication { body: String! comments: [Comment!]! } type Page implements Publication { body: String! } IBUFOBJOUFSO !"
union union EntryOrPage = Entry | Page IBUFOBJOUFSO !"
Query type Query { blog(id: String!): Blog } • リソースを取得する
IBUFOBJOUFSO !"
Mutation type Mutation { createBlog(input: CreateBlogInput!): Blog } input CreateBlogInput
{ title: String! } • リソースを更新する IBUFOBJOUFSO !"
Subscription type Subscription { entryPosted(blogId: ID!): Entry } • リソースに変更があったことをリアルタイムに受信する
IBUFOBJOUFSO !"
ྫ: GitHub API ͷΫΤϦ $ gh api graphql --verbose -f
query='query { viewer { login repositories(last: 3, visibility: PUBLIC) { nodes { name } } } }' { "data": { "viewer": { "login": "utgwkk", "repositories": { "nodes": [ { "name": "20241217-sketch-mysql-and-goqu" }, { "name": "autonolint" }, { "name": "terraform-provider-aws" } ] } } } } IBUFOBJOUFSO !"
GraphQL εΩʔϚઃܭͷίπ • リソース間の関係を⾃然にたどれるようにする • Mutation が返す専⽤の型を導⼊する • GraphQL Server
Specification に準拠する IBUFOBJOUFSO !!
ϦιʔεؒͷؔΛࣗવʹͨͲΕΔΑ͏ʹ͢Δ type User { name: String! blogs: [Blog!]! } type
Blog { entries(first: Int!): [Entry!]! } type Entry { body: String! comments(first: Int!): [Comment!]! } type Comment { body: String! user: User } IBUFOBJOUFSO !"
Mutation ͕ฦ͢ઐ༻ͷܕΛಋೖ͢Δ type Mutation { createBlog(input: CreateBlogInput!): CreateBlogPayload } type
CreateBlogPayload { blog: Blog } • 更新対象のエンティティをまとめて返す • 付加情報を返す IBUFOBJOUFSO !"
GraphQL Server Specification • Relay がスキーマに要求する追加仕様 • Node インタフェース •
リソースを ID で直接取得する • Connection • ページネーション (継ぎ⾜し読み込み) IBUFOBJOUFSO !"
Node ΠϯλϑΣʔε interface Node { id: ID! } type Query
{ node(id: ID!): Node } IBUFOBJOUFSO !"
Connection type EntryConnection { edges: [EntryEdge!]! pageInfo: PageInfo! } type
EntryEdge { cursor: String! node: Entry! } type PageInfo { hasNextPage: Boolean! hasPreviousPage: Boolean! startCursor: String endCursor: String } type Blog { entries( first: Int, last: Int, before: String, after: String, ): EntryConnection! } IBUFOBJOUFSO !"
GraphQL ͱޓੑ • クライアントが参照していないフィールドを⾃由に追加できる • Query/Mutation/Subscription も同様 • クライアントが参照しているフィールドを変更‧削除すると互 換性が壊れる
• 型やフィールドを分ける • @deprecated を活⽤する IBUFOBJOUFSO !"
@deprecated directive type Entry { title: String! body: String! name:
String @deprecated(reason: "Use `title`.") } IBUFOBJOUFSO !"
πʔϧηοτͷαϙʔτ • サーバ • スキーマからのコード⽣成 • リゾルバの実装 • クライアント •
UI ライブラリとの連携 • 型定義の⽣成 • キャッシュの管理 • GraphiQL IBUFOBJOUFSO !"
GraphQL ͷಛ • クライアントは必要⼗分なデータを取得できる • クライアントはスキーマに基づいてリクエストを組み⽴てる • サーバ側は複雑になりがち • N+N
クエリ • Dataloader • ⾃由に書けすぎるので制限が必要 • クエリの複雑度に上限を設ける • Persisted Query • ログ‧トレーシング IBUFOBJOUFSO !"
API • REST • GraphQL • gRPC IBUFOBJOUFSO !"
gRPC • Google によって開発された • RPC (Remote Procedure Call) のためのシステム
• 定義ファイルからのコード⽣成 • HTTP/S ベース • 双⽅向ストリーミングもサポート IBUFOBJOUFSO !!
Protocol Buffers • 構造化されたデータをシリアライズする仕組み • バイナリフォーマット • IDL (Interface Description
Language) • .protoファイル • RPC をサポートしている IBUFOBJOUFSO !"
gRPC ͱ Protocol Buffers • gRPC = Protocol Buffers を使うプロトコル
ではない • シリアライズ⽅式はなんでもいい • Protocol Buffers を使うと楽、ということは⾔及されている IBUFOBJOUFSO !"
syntax = "proto3"; package account; service Account { rpc Signup(SignupRequest)
returns (SignupReply); } message SignupRequest { string name = 1; string password = 2; } message SignupReply { string token = 1; } IBUFOBJOUFSO !"
ϝοηʔδܕ message SignupRequest { string name = 1; string password
= 2; } ϑΟʔϧυܕ ϑΟʔϧυ໊ = ϑΟʔϧυ൪߸; • フィールド番号が重要 IBUFOBJOUFSO !"
ޓੑ • フィールド番号 int32 old_field = 6 [deprecated = true];
reserved 2, 15, 9 to 11; reserved "foo", "bar"; IBUFOBJOUFSO !"
Protocol Buffers ͷόʔδϣχϯά パッケージ名によってバージョニングを実現 • 例: Firestore RPC API •
google.firestore.v6 • google.firestore.v6beta6 IBUFOBJOUFSO !"
αʔϏεͱετϦʔϜ service RouteGuide { rpc GetFeature(Point) returns (Feature) {} rpc
ListFeatures(Rectangle) returns (stream Feature) {} rpc RecordRoute(stream Point) returns (RouteSummary) {} rpc RouteChat(stream RouteNote) returns (stream RouteNote) {} } IBUFOBJOUFSO !"
RPC ͷछྨ (1) • Unary RPCs (SimpleRPC) • single request
single response • シンプルな通信 • Server streaming RPC • クライアント側はすべてのメッセージを受信すると処理を完 了する IBUFOBJOUFSO !"
RPC ͷछྨ (2) • Client streaming RPC • クライアント側は複数のメッセージを送り単⼀のメッセージを受信する •
Bidirectional streaming RPC • 双⽅向ストリーミングのこと • クライアント側とサーバー側のストリームは独⽴している • そのためそれぞれ任意の順序でメッセージの読み書きができる IBUFOBJOUFSO !"
gRPC ʹ͓͚Δ API ઃܭ CRUD + List • CreateEntity •
GetEntity • UpdateEntity • DeleteEntity • ListEntities IBUFOBJOUFSO !"
API • いくつかの API について⾒てきた • REST • GraphQL •
gRPC • 特徴とトレードオフを理解して使おう IBUFOBJOUFSO !!
͓ΘΓ IBUFOBJOUFSO !"
ࢀߟࢿྉ IBUFOBJOUFSO !"
HTTP • HTTP の概要 - HTTP | MDN • HTTP
の進化 - HTTP | MDN • Set-Cookie - HTTP | MDN • SameSite属性とCSRFとHSTS - Cookieの基礎知識からブラウザごとのエッ ジケースまでおさらいする - GMO Flatt Security Blog • Real World HTTP 第3版―歴史とコードに学ぶインターネットとウェブ技術 • Web配信の技術―HTTPキャッシュ‧リバースプロキシ‧CDNを活⽤する IBUFOBJOUFSO !"
REST • Fielding Dissertation: CHAPTER 8: Representational State Transfer (REST)
• REST という概念が初めて提唱された論⽂ • GitHub REST API documentation - GitHub Docs • API Reference - OpenAI API • Web API: The Good Parts IBUFOBJOUFSO !"
GraphQL • GraphQL Specification (October 5657 Edition) • GraphQL Server
Specification | Relay • Relayに学ぶGraphQLのスキーマ設計 - cockscomblog? • 初めての GraphQL―Webサービスを作って学ぶ新世代API IBUFOBJOUFSO !"
gRPC (Protocol Buffers) • Introduction to gRPC | gRPC •
Language Guide (proto 7) | Protocol Buffers Documentation • gRPC over HTTPB • Cloud Firestore API | Google Cloud • HTTP/B と gRPC に対するよくある誤解。 - ねののお庭。 IBUFOBJOUFSO !"