👋

Postman Collection が gRPCCurlコマンドのインポートに対応したのでやってみた

に公開

Postman Collection はテスト用API呼び出しを作成して保存・管理できるサービスですが、REST用HTTP呼び出しの他に複数のプロトコルに対応しています。
GraphQL,gRPC,WebScoket,Socket.IO,MCP

2025年12月5日にgRPCCurl コマンドのインポートに対応しましたのでやってみます。
https://www.postman.com/release-notes/postman-app/#11-74-5

gRPC と gRPCCurl

gRPC は、Google によって開発された 高性能な RPC(Remote Procedure Call)フレームワークです。HTTP/2 をトランスポートとして利用し、データのシリアライズには Protocol Buffers(protobuf) を採用しています。

REST API が「URL + HTTPメソッド + JSON」を基本とするのに対し、gRPC は 「サービス定義(.proto)に基づいてメソッドを直接呼び出す」 という設計思想を持ちます。バイナリ通信による高速かつ低レイテンシな通信が期待できることから、マイクロサービス間通信 や 内部API では、REST よりも gRPC が選ばれるケースが増えています。

一方で、gRPC には REST API と比べて 学習・検証のハードルが高い という側面があります。
RESTと異なり、エンドポイントだけを見ても仕様が分からず、.proto ファイルがないとリクエストを作れないとう技術特性を持ちます。

gRPCCurlを使うことで、使い慣れたcurlコマンドと同じ感覚でgRPCサーバとの疎通テストが行えるようになります。Server Reflectionという機能をサーバ側が備えていれば、.protoファイルなしでもサービス構造の確認を行うことが可能となります。

このブログでは2回連載でPostmanとgRPCサーバの通信を行っていきます。

やってみる (第一回:Server Reflectionなし)

1. gRPCサーバの準備

まずは以下のコマンドでnodeの環境をイニシャライズします。

mkdir grpc-local-demo
cd grpc-local-demo
npm init -y
npm i @grpc/grpc-js @grpc/proto-loader

次にproto/hello.protoというファイルを作成します。

syntax = "proto3";

package hello;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

以下の部分がポイントです。

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

この定義は、gRPC における サービス(Service) と RPC メソッド を宣言しています。
gRPC では、REST API における「エンドポイントの集合」に相当する概念が service です。
Greeter はサービス名を表します。このサービスは「挨拶を返す」ことを目的とした API 群であり、ここでは 1 つの RPC メソッド SayHello を公開しています。

では以下のスクリプトを使用してサーバを起動します。

server.cjs
// server.cjs
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
const path = require("path");

const PROTO_PATH = path.join(__dirname, "proto", "hello.proto");

const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
  keepCase: true,
  longs: String,
  enums: String,
  defaults: true,
  oneofs: true,
});
const helloProto = grpc.loadPackageDefinition(packageDefinition).hello;

function sayHello(call, callback) {
  const name = call.request?.name || "world";
  callback(null, { message: `Hello, ${name}!` });
}

function main() {
  const server = new grpc.Server();
  server.addService(helloProto.Greeter.service, { SayHello: sayHello });

  const addr = "127.0.0.1:50051";
  server.bindAsync(addr, grpc.ServerCredentials.createInsecure(), (err, port) => {
    if (err) {
      console.error("[SERVER] bind error:", err);
      process.exit(1);
    }
    server.start();
    console.log(`[SERVER] gRPC server listening on ${addr} (port=${port})`);
  });

  process.on("SIGINT", () => {
    console.log("\n[SERVER] shutting down...");
    server.tryShutdown(() => process.exit(0));
  });
}

main();

node server.js

2. Postman にgRPCCurlコマンドのインポート

このサーバと疎通するgRPCCurlコマンドは以下になります。

grpcurl -plaintext -d '{"name":"Kameda"}' localhost:50051 hello.Greeter/SayHello

Collectionにインポートをクリックして表示されるウインドウに上記のコマンドを貼り付けます。

メソッドを選択をクリックします。

先ほど作成した.protoファイルをインポートします。

定義されたメソッドを認識しましたのでそちらを指定して呼び出しを行います。


無事疎通が行えました。

次回予告

今回の記事では.protoファイルを検証者側が持っている前提のシナリオを行いました。次回は。Server Reflectionを用いた、.protoファイルなしでも検証が行えるシナリオを見ていきます。

Discussion