如何从 cURL 命令或在 Internet 浏览器中通过 HTTP/1.1 调用 gRPC 服务器

SOW*_*G M 5 java proto grpc grpc-java

我在 protobuf 文件中添加了以下新代码并编译以获取生成的 grpc_pb 文件。

service EchoService {
  rpc Echo(EchoMessage) returns (EchoMessage) {
    #-----New code start-----
    option (google.api.http) = {
      post: "/v1/echo"
      body: "*"
    };
    #-----New code end------
  }
}
Run Code Online (Sandbox Code Playgroud)

从在命令下面执行的 cURL 命令

curl -X POST -k https://localhost:10000/v1/echo -d '{"Key": "Value"}'
Run Code Online (Sandbox Code Playgroud)

提出上述请求后,无法得到正确的响应。

我的疑问是,准备将响应发送回调用者所需的任何服务器端代码更改?如果是这样,请建议我使用代码(Java)以及如何提出请求。如果没有,我们需要如何向grpc发出http请求?

工作示例非常感谢。

Bay*_*ayu 8

为了在没有客户端的情况下测试 gRPC 服务器,我们必须使用grpcurlnot curl。请看https://github.com/fullstorydev/grpcurl

但是,根据我的经验,需要使其工作。首先,请确保您的服务支持Reflection,您可以从https://github.com/sourcegraph/gophercon-2018-liveblog/issues/27阅读它。跨编程语言有不同的方式进行反射。我的建议是,仅在开发阶段执行此操作,否则人们可能会查询您的 gRPC 端点。也许你可以用它if()来制作一个条件块。对于 Golang,我做了这个

import "google.golang.org/grpc/reflection"

if os.Getenv("GO_ENV") == "development" {
    reflection.Register(s)
}
Run Code Online (Sandbox Code Playgroud)

然后,您需要知道您的 gRPC 服务器中可用的服务。有两种方法可以了解结构。首先您可以从您的 proto 文件中读取它们,其次通过执行命令grpcurl localhost:10000 list

  • 如果你想从你的 proto 文件中读取,路径应该是packageName.Service/rpcMethodName. 所以,根据你的原型,它应该是这样的,EchoService/Echo或者如果你有包名,它将是packageName.EchoService/Echo
  • 如果您愿意grpcurl localhost:10000 list,只需键入这些命令,它就会输出服务路径。

最后一点需要注意的是,当你在本地测试并且没有设置 SSL/TLS 时,请使用-plaintextoption,否则,它会告诉你 TLS 握手失败。

示例命令,基于您的 proto,本地调用将如下所示:

grpcurl -plaintext -d '{"Key": "Value"}' 127.0.0.1:10000 EchoService/Echo

希望能帮助到你。


2020 年 6 月 30 日更新:

使用 gRPC 几个月后,我发现了另一个有趣的 gRPC 工具: