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
connect-go を利⽤したWeb開発
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takahiro INAGAKI
June 28, 2025
7
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
connect-go を利⽤したWeb開発
Tech Talk Together #2
Takahiro INAGAKI
June 28, 2025
More Decks by Takahiro INAGAKI
See All by Takahiro INAGAKI
clickhouse-localを使ってS3に保存したログを解析する
ophum
0
24
Featured
See All Featured
Building AI with AI
inesmontani
PRO
1
1.3k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
270
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
A designer walks into a library…
pauljervisheath
211
25k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Between Models and Reality
mayunak
4
500
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Un-Boring Meetings
codingconduct
0
460
Docker and Python
trallard
47
4.2k
Transcript
connect-go を利用した Web 開発 2025-06-29 Tech Talk Together #2 @hum_op_dev
1
自己紹介 hum_op X: @hum_op_dev Blog: super-g.eek.jp GitHub: ophum 2
API を作るの面倒くさくないですか プロトコルは? データの形式は? サーバー・クライアントの実装は? 3
connect-go とは gRPC 互換の HTTP API を作成するためのライブラリ。 Protocol Buffer の定義ファイルからコードを生成
gRPC, gRPC-Web, Connect の独自プロトコルに対応している Connect の独自プロトコルは HTTP1.1 でも動作する 4
Protocol Buffer の定義ファイルからコードを生成 message PostRequest { string title= 1; string
content = 2; } message PostResponse { string id = 1; } service BlogService { rpc Post(PostRequest) returns (PostResponse) {} } 5
message PostRequest { string title= 1; string content = 2;
} こんな感じの構造体になる type PostRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` } 6
service BlogService { rpc Post(PostRequest) returns (PostResponse) {} } こんな感じの
Interface が生成されるのでこれを満たす実装をする // BlogServiceHandler is an implementation of the blog.v1.BlogService service. type BlogServiceHandler interface { Post(context.Context, *connect.Request[v1.PostRequest]) (*connect.Response[v1.PostResponse], error) } 7
こんな感じ。 type blogService struct {} func (s *blogService) Post( ctx
context.Context, req *connect.Request[v1.PostRequest], ) (*connect.Response[v1.PostResponse], error) { // ここに実装していく! id := createPost(ctx, req.Title, req.Content) return &connect.Response[v1.PostResponse]{ Msg: &v1.PostResponse{ Id: id, }, }, nil } 8
いいところ 実装するときに HTTP や gRPC といったプロトコル周りやデータのシリアライズ・デ シリアライズを気にしなくてよい! req *connect.Request[v1.PostRequest] のように型が決まった状態でコーディングでき
る 9
クライアントも生成される // BlogServiceClient is a client for the blog.v1.BlogService service.
type BlogServiceClient interface { Post(context.Context, *connect.Request[v1.PostRequest]) (*connect.Response[v1.PostResponse], error) } // blogServiceClient implements BlogServiceClient. type blogServiceClient struct { post *connect.Client[v1.PostRequest, v1.PostResponse] } // Post calls blog.v1.BlogService.Post. func (c *blogServiceClient) Post( ctx context.Context, req *connect.Request[v1.PostRequest], ) (*connect.Response[v1.PostResponse], error) { return c.post.CallUnary(ctx, req) } 10
Browser 用のクライアント実装を生成できる connect-web というので TypeScript のクライアントを生成できる import { BlogService }
from "./gen/blog/v1/blog_pb"; import { createConnectTransport } from "@connectrpc/connect-web"; import { createClient } from "@connectrpc/connect"; const transport = createConnectTransport({ baseUrl: "http://localhost:8080", }); const client = createClient(BlogService, transport); const res = await client.post({ title: "connect-goを利用したWeb開発", content: "connect-go便利!", }); console.log(res.id); 11
生成 12
緑のところは proto ファイルから生成! 13
まとめ connect-go を利用すると Client/Server の実装を生成できる 生成された型を利用するのでシリアライズ・デシリアライズを気にしなくてよい ブラウザから接続したい場合は connect-web を利用する proto-gen-*
というプラグインを利用して各種実装を生成している protoc-gen-go は構造体 protoc-gen-connect-go は connect の Client/Server 実装 protoc-gen-es はブラウザで利用できる Client 実装 14