🫥

curlでgRPC-WEBのRequestをする方法

2024/08/19に公開

アンサー

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にデータを渡す場合、空文字化を防ぐため標準入力から渡す必要がある
  • content-typeの指定は、application/grpc-web+proto
  • --output -をつけて、バイナリをそのまま表示するようにしている(やらないとエラーメッセージが出る)

ブラウザのcURLコピーが動かない件

ブラウザ - デベロッパーツール - ネットワーク - 対象のリクエスト - 右クリック - Copy - Copy as cURL

とやると、curlでコピーできて良いのですが、そのリクエストがgRPC-WEBの場合、動かないです。。。

一応、下記でChrome側にバグ修正依頼を出しているみたいです。

https://github.com/grpc/grpc-web/issues/1394

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さんの公開記事のサンプルで確認

https://qiita.com/suin/items/e594ce7ab7b6a0d8d6ec

中に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