0%

postman grpc test

如何用 postman grpc 调用 API

postman

https://www.postman.com/ postman 想必大家已经很熟悉了, 平时用得比较多的是 HTTP call 测试。但有的服务,只有 grpc, 没有 http 方法, 测试的时候别无选择.

参考官方的文档:https://learning.postman.com/docs/sending-requests/grpc/grpc-client-overview/

什么是 RPC

RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,它允许一台计算机程序调用另一台计算机上的程序,而不需要程序员显式编写远程调用的代码。通过 RPC,程序员可以编写分布式应用程序,使得程序像运行在本地一样简单。
RPC 框架一般分为三个部分:客户端、服务器端和协议。客户端调用本地的代理程序,代理程序负责将调用转换为网络消息,然后发送给服务器端。服务器端接收到消息后,解析消息,调用本地的程序执行对应的操作,然后将结果返回给客户端。协议规定了客户端和服务器端之间的通信格式和方式,包括消息的结构、编码方式、传输协议等。
RPC 框架有很多种,常见的包括 gRPC、Thrift、Dubbo 等,它们都提供了类似的功能,使得开发人员可以快速地构建分布式应用程序。
总之,RPC 是一种计算机通信协议,可以让程序像本地程序一样调用远程程序,它可以帮助开发人员快速构建分布式应用程序。

什么是 gRPC

gRPC(g stands for Google)是一种高性能、开源、通用的远程过程调用(RPC)框架,由 Google 开发,支持多种编程语言。gRPC 基于 Protocol Buffers(protobuf)序列化协议开发,提供了比传统的 HTTP/REST API 更快、更可靠和更高效的远程服务调用方式。
gRPC 的核心设计理念是定义服务,生成客户端和服务器端的 stub(存根),使得客户端和服务器端可以像调用本地方法一样调用远程方法,而且支持多种编程语言,包括 C、C++、Java、Python、Go、Ruby、Node.js 等。在 gRPC 中,客户端只需要通过服务定义文件来生成相应的客户端 stub,然后就可以像调用本地方法一样调用远程服务,非常方便。
gRPC 支持四种不同类型的服务方法,分别是:

  • 单向流:客户端发送一组请求到服务器端,但不等待回应。
  • 双向流:客户端和服务器端可以同时发送多组请求和回应。
  • 服务端流:客户端发送一组请求到服务器端,等待服务器端返回多组回应。
  • 客户端流:客户端发送多组请求到服务器端,等待服务器端返回一组回应。

除此之外,gRPC 还提供了许多功能,例如支持 TLS/SSL 安全传输、支持客户端和服务器端的流量控制、支持多语言扩展等。
总之,gRPC 是一种高性能、开源、通用的 RPC 框架,可以支持多种编程语言,提供了比传统的 HTTP/REST API 更快、更可靠和更高效的远程服务调用方式。

什么是 Protobuf

Protobuf,全称为 Protocol Buffers,是一种语言无关、平台无关、可扩展的序列化数据格式,由 Google 公司开发。它支持多种编程语言,包括 C++、Java、Python 等,可以在不同的系统之间进行数据交换和存储。
与 XML 和 JSON 等数据格式相比,Protobuf 具有更高的序列化和反序列化效率、更小的数据体积以及更简单的数据结构定义。使用 Protobuf 可以帮助开发人员轻松地定义数据结构,然后使用自动生成的代码来进行序列化和反序列化。
在实际应用中,Protobuf 主要用于分布式应用程序中的数据传输和存储,例如在 Google 内部的各种系统和服务中就广泛使用了 Protobuf。
总之,Protobuf 是一种语言无关、平台无关、可扩展的序列化数据格式,具有更高的效率和更小的数据体积,可以帮助开发人员轻松地定义数据结构并进行数据传输和存储。

开始实验

先来看一看这个 pb 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
syntax = "proto3";

package todolistpb;

import "google/protobuf/empty.proto";
import "google/api/annotations.proto";
import "protoc-gen-swagger/options/annotations.proto";

// Generated by Kit - do not change this package
option go_package = "xxxxxxxxx/gophers/go/todolist/pb";

// The base path is only for Swagger and does not affect the routing - do not change this.
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = {
base_path: "/todolist"
};

service Todolist {
rpc AddTodo(AddTodoRequest) returns (AddTodoResponse) {
option idempotency_level = IDEMPOTENCY_UNKNOWN;
option (google.api.http) = {
post: "/addTodo"
body: "*"
};
}

rpc ListTodos(google.protobuf.Empty) returns (ListTodosResponse) {
option idempotency_level = NO_SIDE_EFFECTS;
option (google.api.http) = {
get: "/listTodos"
};
}

rpc DoneTodo(DoneTodoRequest) returns (ListTodosResponse) {
option idempotency_level = NO_SIDE_EFFECTS;
option (google.api.http) = {
get: "/doneTodo"
};
}

}

message AddTodoRequest {
string author = 1;
string description = 2;
}

message AddTodoResponse {
Todo todo = 1;
}

message Todo {
int64 id = 1;
string author = 2;
string description = 3;
bool done = 4;
string created_at = 5;
}

message ListTodosResponse {
repeated Todo todos = 1;
}

message DoneTodoRequest {
repeated int64 id = 1;
}

需要注意的地方是 import 的路径, 比如在 goland IDE 里面,也需要设置,如下图所示

在 postman 里面导入了 Protocol Buffers 文件后,可以直接点击橙色的 next ,如果有报错,则说明缺少了依赖,需要导入依赖的包的路径。和上图类似

因为我们本地的服务监听在 8087, 所以地址就填写 localhost:8087 , 可以看到是两个蓝色的箭头双向流:
我们先 add 一条记录

然后再查询所有的

需要注意的地方

  • 注意时间的格式 https://protobuf.dev/reference/php/api-docs/Google/Protobuf/Timestamp
    protected $seconds Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive. 可以在这个网站转换 https://www.epochconverter.com/
    protected $nanos Non-negative fractions of a second at nanosecond resolution. Negative second values with fractions must still have non-negative nanos values that count forward in time. Must be from 0 to 999,999,999 inclusive.
    1
    google.protobuf.Timestamp startTime = 9