java - 如何从 cURL 命令或互联网浏览器通过 HTTP/1.1 调用 gRPC 服务器

标签 java grpc grpc-java proto

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

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

从命令下方执行的 cURL 命令

curl -X POST -k https://localhost:10000/v1/echo -d '{"Key": "Value"}'

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

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

非常感谢工作示例。

最佳答案

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

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

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

if os.Getenv("GO_ENV") == "development" {
    reflection.Register(s)
}

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

  • 如果你想从你的原型(prototype)文件中读取,路径应该是packageName.Service/rpcMethodName。因此,根据您的原型(prototype),它应该类似于 EchoService/Echo 或者如果您有包名称,它将是 packageName.EchoService/Echo
  • 如果您更喜欢grpcurl localhost:10000 list,只需键入这些命令,它就会输出服务路径。

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

示例命令,基于您的原型(prototype),本地调用如下所示:

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

希望对您有所帮助。


2020 年 6 月 30 日更新:

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

关于java - 如何从 cURL 命令或互联网浏览器通过 HTTP/1.1 调用 gRPC 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56580535/

相关文章:

Java gRPC 从 ServerInterceptor 获取服务名称

c++ - 尽管在 Linux 内核版本 4.5 下,gRPC(C Base) 轮询引擎仍使用 'epollex' 构建

java - 如何实现Grpc用户名/密码认证。 Python 客户端、Java 服务器

Java 调用堆栈检查和操作

java - 在Java中使用两个线程打印奇数和偶数

go - 如何在golang中解压缩grpc status.details错误?

java - 无法在 Quarkus 上启动 gRPC 服务器 - 无法找到暴露 `BindableService` 的 beans

java - 如何让 GRPC 服务器在另一个 Web 服务器(不是 Netty)上运行

java - 莫基托 : Basic Code doubts

java - 我可以从 Eclipse/IDE 调试器连接到远程机器上的 jsadebugd 进程吗?