当前位置: 首页 > 知识库问答 >
问题:

无法使用google/API/annotations

耿珂
2023-03-14

我尝试使用谷歌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

也许是原因?


共有2个答案

夹谷硕
2023-03-14

我也遇到了同样的问题,我正在尝试自动化一个解决方案,该解决方案可以在任何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,但每次执行后都会丢弃它,这是不好的。但现在它已经足够好了,可能对一些人有帮助。

当做

钱德元
2023-03-14

将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

  • 运行该命令后,我没有看到任何输出,也没有看到名为的系统环境变量(它应该出现在那里吗?)。 当我尝试运行一些基本的示例代码时: 即使在手动将该值添加到系统环境变量之后,我也会得到相同的错误。