我尝试使用谷歌api注释在gRPC上使用REST。不幸的是,我面临一个协议问题,告诉我注释。proto不存在或有错误。我尝试了几次修复,但都没有成功。
我甚至试图重新安装一个完整的堆栈,以防我做错了什么。我会尽可能详细地说明我从新安装中设置的完整行和文件。
从新安装的VM中,我键入以下shell行:
$mkdir源代码/Go语言
输出GOPATH语言
$source ~/.zshrc
$cd源代码/Go语言
$mkdir src
$cd src
$export PATH=$PATH:$GOPATH/bin
$go-get-u google.golang.org/grpc
获取github.com/golang/protobuf/protoc-gen-go
获取github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
$go-get-u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger
$mkdir-p test/proto/test
$cd-test/proto/test
$vim测试.proto
在我的测试中。proto文件,我写了非常基本的行:
syntax = "proto3";
package main;
import "google/api/annotations.proto";
service Tester {
rpc Test (Request) returns (Reply) {
option (google.api.http) = { get: "/v1/test" };
}
}
message Request {
string Message = 1;
}
message Reply {
string Message = 1;
}
然后呢
$cd$GOPATH/src
$vimmain.go
在我的主要。去吧,也很基本:
package main
import (
tc "test/proto/test"
"context"
"fmt"
"log"
"net"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
)
func main() {
err := StartServer("tcp", "127.0.0.1:50051")
if err != nil {
fmt.Printf("Error!! %s", err)
}
}
type Server struct {
tc.UnimplementedTesterServer
}
func (s *Server) Test(ctx context.Context, in *tc.Request) (*tc.Reply, error) {
return &tc.Reply{Message: ""}, nil
}
func StartServer(protocol string, port string) error {
lis, err := net.Listen(protocol, port)
if err != nil {
fmt.Printf("failed to listen: %v", err)
}
s := grpc.NewServer()
tc.RegisterTesterServer(s, &Server{})
error := s.Serve(lis)
if error != nil {
fmt.Printf("failed to serve: %v", error)
return error
}
return nil
}
最后,我尝试编译我的proto文件:
$protoc—proto\u路径=:$GOPATH/src—go\u out=plugins=grpc:。proto/*/*。proto
我系统地有以下错误:
proto/test/test.proto:5:1: Import "github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/google/api/annotations.proto" was not found or had errors.
当我看到文件通过
go get...
时,它们被放置在$GOPATH/pkg/mod/下
例如googleapis的注释。原型文件位于:$GOPATH/pkg/mod/github.com/grpc-ecosystem下/grpc-gateway@v1.12.1/第三方/googleapis/google/api/annotations.proto
也许是原因?
我也遇到了同样的问题,我正在尝试自动化一个解决方案,该解决方案可以在任何Linux上运行,并且依赖性尽可能少。
grpc_gateway的官方文件规定:
您需要向protoc编译器提供所需的第三方protobuf文件。它们包含在本回购协议的第三方/googleapis文件夹下,我们建议将它们复制到您的protoc generation文件结构中。如果您已经根据类似Buf样式指南的内容构建了原型文件,您可以将文件复制到顶级/google文件夹中。
换句话说:以某种方式下载它并使其工作。
此外,由于这段引用也是原始源代码中的一段引用,因此不太明显,这使得我在前两次阅读时跳过了它,寻找解决方案,这很糟糕。
因此,正如我在@SeanF答案的评论中所说,使用go get不是一个可维护的选项,因为它将项目保存在名称包含最新版本的文件夹中,这会在版本更改时导致维护问题。
因此,最好的选择实际上是克隆grpc网关项目:
git clone https://github.com/grpc-ecosystem/grpc-gateway
protoc -I grpc-gateway/ \
-I grpc-gateway/third_party/googleapis \
--go_out=plugins=grpc:. proto/*/*.proto
我还用我的解决方案写了一个要点,它只依赖于docker和bash,因此应该是稳定的:
https://gist.github.com/VinGarcia/43dfa71b412c16b9365c224d3760af5e
它有一个问题,我使用的是go。mod,但每次执行后都会丢弃它,这是不好的。但现在它已经足够好了,可能对一些人有帮助。
当做
将protobuf命令和go命令混合在一起会使问题变得更加复杂。只需关注protobuf来处理错误。
您正在导入“google/api/annotations.proto”
您的proto\u路径是--proto\u路径=.:$GOPATH/src
这意味着当你执行protoc时,你应该把文件放在/google/api/annotations。proto或$GOPATH/src/google/api/annotations.proto
作为一个应用程序的一部分,我正在工作,我想提供一个假期列表。我试图使用谷歌API来做到这一点。在编写代码之前,我只想看看返回的JSON是什么样子的。 我在谷歌建立了一个帐户,得到了一个API密钥,并被设置为使用谷歌日历API。我对获取假期列表所需的HTML进行了研究,但似乎无法使其工作。我浏览了所有的日历API文档,但没有找到任何关于检索假日列表的内容。以下是我尝试的一些URL和收到的回复。我在网
我使用以下链接使用谷歌云存储: 谷歌云 我想上传一个对象,使用上面的API中给出的插入函数。我使用的代码如下: 但我得到的错误如下: 致命错误:未捕获的异常“Google_ServiceException”,消息为“调用POST时出错”https://www.googleapis.com/storage/v1beta1/b/mybucket/o: (400)第66行的/home/www/publi
Spring Boot主应用程序 全堆栈跟踪
我试图下载一个文件从谷歌驱动器使用谷歌SDK API使用node.js. 但是我无法在服务器端写入/保存文件-node.js 代码:- 我得到这个在控制台:-内容xhr.response文本是这样的东西 请帮我知道我从Drive Api得到的数据的格式是什么,并把它写成哪种格式,这样我就得到了一个完整的. docx文件 编辑 如果xmlRequest有助于我下载文件(.docx),我愿意使用xml
我试图通过使用谷歌地图的api来获取我发送的位置的附近位置。下面是url(https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362 日志e(“Res”,response.body()。getStatus()); 我是不是用正确的方式进行改造? 我的客户。爪哇: Near
运行该命令后,我没有看到任何输出,也没有看到名为的系统环境变量(它应该出现在那里吗?)。 当我尝试运行一些基本的示例代码时: 即使在手动将该值添加到系统环境变量之后,我也会得到相同的错误。