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
はてなサマーインターンシップ2025 Web API 講義資料
Search
Hatena
October 14, 2025
Technology
1.1k
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
60分で学ぶクラウドとSRE・サービス運用 / GeekCAMPAcademia 2026-05
hatena
1
79
エンジニアリング マネージャーの育成と評価軸の考え方
hatena
0
600
Perlブートキャンプ
hatena
0
5.1k
はてなサマーインターンシップ2025 フロントエンド 講義資料
hatena
21
11k
はてなサマーインターンシップ2025 コンテナ + Kubernetesハンズオン 講義資料
hatena
0
740
はてなサマーインターンシップ2025 クラウドと運用 講義資料
hatena
0
780
はてなサマーインターンシップ2025 RDBMSの基礎 講義資料
hatena
0
840
はてなサマーインターンシップ2025 セキュリティ 講義資料
hatena
0
780
はてなサマーインターンシップ2025 AIエージェント活用 講義資料
hatena
1
2.7k
Other Decks in Technology
See All in Technology
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
150
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
140
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.3k
日本 Fintech 未来予測レポート 2027〜2028年(オリジナル版)
8maki
0
2.3k
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
110
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
7
1.9k
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
1.3k
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
260
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
160
Agile and AI Redmine Japan 2026
hiranabe
3
230
ザ・データベース、MySQL ~ OSC 2026 Sendai ~
sakaik
0
130
気づかぬうちにセキュリティ負債を生むAPIキー運用
sgwrmctk
0
180
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Side Projects
sachag
455
43k
Amusing Abliteration
ianozsvald
1
210
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
HDC tutorial
michielstock
2
720
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Leo the Paperboy
mayatellez
7
1.8k
Are puppies a ranking factor?
jonoalderson
1
3.6k
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 !"