尝试列出 GCP 组织内的文件夹时出错

Error while trying to list folders inside a GCP organisation

我正在尝试在 GO 中编写一个简单的代码,使用 resourcemanager API 列出 GCP 组织下的所有文件夹。下面是我的代码:

package main

import (
   "context"
   "log"

   resourcemanager "cloud.google.com/go/resourcemanager/apiv2"
   "google.golang.org/api/iterator"
   resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v2"
)

func main() {
   ctx := context.Background()
   c, err := resourcemanager.NewFoldersClient(ctx)
   if err != nil {
       // TODO: Handle error.
       log.Println("Error: Failed to start client.")
   }
   defer c.Close()

   req := &resourcemanagerpb.ListFoldersRequest{
       Parent: "organizations/<MY-ORG-NAME>",
   }

   it := c.ListFolders(ctx, req)

   tries := 0

   for {
       resp, err := it.Next()
       if err == iterator.Done || tries == 3 {
           break
       }
       if err != nil {
          log.Println(err)
       }
       // TODO: Use resp.
       log.Println(resp)
       tries++
   }
}

代码是直接从API文档中复制过来的,我只是添加了我的组织名称,添加了一些日志功能并限制了for循环中的尝试,因为它一直在打印错误。

每当我 运行 代码时,我都会收到以下错误消息:

2021/11/04 17:06:41 rpc error: code = Unimplemented desc = unexpected HTTP status code received from server: 404 (Not Found); transport: received unexpected content-type "text/html; charset=UTF-8"

我不确定这是否是解决方案,但是;我想我需要在我的目录中添加一个 .proto 文件才能正常工作,但我不明白该怎么做,也不知道该放什么。我是 GO 的新手,这是我第一次使用 API,所以这一切对我来说似乎很混乱。

非常感谢任何帮助!

迁移到 API v3 解决了这个问题。这非常有效!

感谢所有发表评论的人和找到解决方案的同事!

package main

import (
    "context"
    "fmt"
    "log"

    cloudresourcemanager "google.golang.org/api/cloudresourcemanager/v3"
)

func main() {
    ctx := context.Background()
    svc, err := cloudresourcemanager.NewService(ctx)
    if err != nil {
        log.Fatal(err)
    }
    foldersService := cloudresourcemanager.NewFoldersService(svc)
    foldersListCall := foldersService.List()
    foldersListCall.Parent("organizations/<MY-ORG-ID>")
    resp, err := foldersListCall.Do()
    if err != nil {
        log.Fatal(err)
    }
    for _, fld := range resp.Folders {
        fmt.Println(fld.DisplayName)
    }
}