📖

connect-goを2年以上使って

2025/01/04に公開

感想

  • これからGoでAPIサーバーを書くならこれ以外の選択肢はないと思えるぐらい有能
  • Web ClientもGenerateできる
    • es-web
    • SWR使うとかその辺は好きにやってOK
  • gRPC/REST APIの両方をサポートしたサーバーを実装できる
  • connect-goを使ったらgRPC-Gateway、gRPC-Webは選択肢に上がらない
  • connect-goはWeb対応をものすごくシンプルに問題を解決している
  • 何も困ることがない
  • validation ruleもprotoファイルに書ける
  • OpenAPI Generatorにありがちなimplementで秘伝のタレを作ることがまず無い
    • スキーマファースト以外できない
  • net/httpのルーターにconnect-goのhandlerをbindしているだけなので、connect-go管理以外の独自endpointを同居させることは可能

慣れが必要な部分

  • protoファイルの書き方
    • リソース指向でOK
    • 規約はconnect-goに倣う
  • protoファイルをどこで管理するか
    • BSRは値段が高い
    • サーバーのリポジトリにおけばいいと思う
  • GETのエンドポイントをデフォルトでは作らない、全てPOST
    • 副作用のないリクエストはGETで送りたいという原理主義者には辛い
      • GETを定義できないことはないが、無理に行う必要はないと考えている
    • REST APIではなく、connect-goプロトコルだと思えば良い
    • option idempotency_level = NO_SIDE_EFFECTS をつけて副作用がないことを知らせよう
  • エラーレスポンスのカスタマイズ
    • protobuf特有の知識が必要なのでコツが少し必要
    • まずはerror codeとmessageだけで進んでいいと思う
  • Serviceの切り方
  • 開発をテストするときにリクエストを送るツール
    • PostmanはgRPCをサポートしている
    • 自分は buf curl コマンドでリクエスト送っている
      • Devin AIに動作確認するコマンドとseedデータ作ってって言ったら80点ぐらいの作ってくれる
      • hack/request/local ディレクトリに動作確認ようのbashスクリプト置いてる
  • 値がnullの場合、jsonのfieldごと消える
    • そういう仕様だと思えばいい
    • 実装上困ることはない
      • {"field_a": null, "field_b": "hoge"} こういうのは {"field_b": "hoge"} こうなる

Discussion