🫥
curlでgRPC-WEBのRequestをする方法
アンサー
printf '\x00\x00\x00\x00\x05\n\x03aaa' \
| curl 'http://localhost:50051/greeting.Greeter/SayHello' \
-X POST \
-H 'content-type: application/grpc-web+proto' \
--data-binary '@-' \
--output -
ポイントとしては、
- --data-binaryにデータを渡す場合、空文字化を防ぐため標準入力から渡す必要がある
- 細かい理由は後述
- --data-binaryの使い方はmanpage参照
- content-typeの指定は、
application/grpc-web+proto
-
--output -
をつけて、バイナリをそのまま表示するようにしている(やらないとエラーメッセージが出る)
ブラウザのcURLコピーが動かない件
ブラウザ - デベロッパーツール - ネットワーク - 対象のリクエスト - 右クリック - Copy - Copy as cURL
とやると、curlでコピーできて良いのですが、そのリクエストがgRPC-WEBの場合、動かないです。。。
一応、下記でChrome側にバグ修正依頼を出しているみたいです。
curlで「\0」バイトを送信する唯一の方法は、ファイル/標準入力から読み込むことだと思います。
2024-08-19現在、Chromeでコピーすると下記のようになる(不要部分はカットしている)
curl 'http://localhost:50051/greeting.Greeter/SayHello' \
-H 'content-type: application/grpc-web+proto' \
--data-raw $'\u0000\u0000\u0000\u0000\u0005\n\u0003aaa'
データ部分もなんか違う。
Firefoxだと下記となり、コピーペーストで動かないのは変わらないがデータは正しい。
(必要部分だけ抽出)
--data-raw $'\x00\x00\x00\x00\x05\n\x03aaa'
suinさんの公開記事のサンプルで確認
中にGithubリポジトリのリンクもあるので簡単に試せる。suinさんに感謝!!
動かし方
## cloneと移動
git clone https://github.com/suinplayground/grpc-web-with-tonic-and-next.js
cd grpc-web-with-tonic-and-next.js
## gRPC-WEBサーバ起動
cd server && cargo run
## client用サーバ起動
cd client && npm i && npm run dev
最後に
gRPC-Webって、出てから結構時間が経っているのに意外と動かない部分もあるのだなと。
(みんなGUIツールを使っているのかな?)
あと、Rustでサーバ作ると変換層を使わずに行けるので良い感じと思った。
あと、gRPC-Webは変換層使うからてっきりjsonに変えてるものだと思っていたらバイナリでやりとりしていたという。
(gRPC-Webのconnectというライブラリはjsonでも出来るとあって混乱した。。。)
(バイナリでやりとりするなら、変換のオーバーヘッドは少ないかもなと思った)
Discussion