如何通过 HTTP/1.1 从 cURL 命令或在 Internet 浏览器中调用 gRPC 服务器
How to make call to gRPC server over HTTP/1.1 from cURL command or in internet browser
我在 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 了解它。 Reflection 跨编程语言有不同的方法。我的建议是,只在开发阶段执行此操作,否则,人们可能会查询您的 gRPC 端点。也许你可以使用 if()
为它做一个条件块。对于 Golang,我这样做了
import "google.golang.org/grpc/reflection"
if os.Getenv("GO_ENV") == "development" {
reflection.Register(s)
}
然后,您需要了解 gRPC 服务器中的可用服务。您可以通过两种方式了解结构。首先你可以从你的原型文件中读取它们,其次通过执行命令 grpcurl localhost:10000 list
- 如果您想从原始文件中读取,路径应该是
packageName.Service/rpcMethodName
。因此,根据您的原型,它应该类似于 EchoService/Echo
或者如果您有包名称,它将是 packageName.EchoService/Echo
- 如果您喜欢
grpcurl localhost:10000 list
,只需键入这些命令,它就会输出服务路径。
最后要注意的是当你在本地测试时没有设置SSL/TLS,请使用-plaintext
选项,否则它会告诉你TLS握手失败。
示例命令,基于您的原型,本地调用如下所示:
grpcurl -plaintext -d '{"Key": "Value"}' 127.0.0.1:10000 EchoService/Echo
希望对您有所帮助。
2020 年 6 月 30 日更新:
在使用 gRPC 几个月后,我发现了另一个有趣的 gRPC 工具:
- 互动工具:https://github.com/ktr0731/evans
- 更简单的 GUI 工具:https://github.com/uw-labs/bloomrpc
我在 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 了解它。 Reflection 跨编程语言有不同的方法。我的建议是,只在开发阶段执行此操作,否则,人们可能会查询您的 gRPC 端点。也许你可以使用 if()
为它做一个条件块。对于 Golang,我这样做了
import "google.golang.org/grpc/reflection"
if os.Getenv("GO_ENV") == "development" {
reflection.Register(s)
}
然后,您需要了解 gRPC 服务器中的可用服务。您可以通过两种方式了解结构。首先你可以从你的原型文件中读取它们,其次通过执行命令 grpcurl localhost:10000 list
- 如果您想从原始文件中读取,路径应该是
packageName.Service/rpcMethodName
。因此,根据您的原型,它应该类似于EchoService/Echo
或者如果您有包名称,它将是packageName.EchoService/Echo
- 如果您喜欢
grpcurl localhost:10000 list
,只需键入这些命令,它就会输出服务路径。
最后要注意的是当你在本地测试时没有设置SSL/TLS,请使用-plaintext
选项,否则它会告诉你TLS握手失败。
示例命令,基于您的原型,本地调用如下所示:
grpcurl -plaintext -d '{"Key": "Value"}' 127.0.0.1:10000 EchoService/Echo
希望对您有所帮助。
2020 年 6 月 30 日更新:
在使用 gRPC 几个月后,我发现了另一个有趣的 gRPC 工具:
- 互动工具:https://github.com/ktr0731/evans
- 更简单的 GUI 工具:https://github.com/uw-labs/bloomrpc