Google app engine 将Google云存储API与Go AppEngine一起使用
我已经编写了一个测试代码,通过云存储API列出存储桶,但是在运行代码时出现以下错误:Google app engine 将Google云存储API与Go AppEngine一起使用,google-app-engine,go,google-cloud-storage,Google App Engine,Go,Google Cloud Storage,我已经编写了一个测试代码,通过云存储API列出存储桶,但是在运行代码时出现以下错误: googleapi: Error 403: Forbidden, forbiddenFinished 我已经检查了权限,appengine服务帐户可以访问这些存储桶,appengine应用程序和云存储存储存储桶都在同一个项目中 这是我的示例代码: package src import ( "fmt" "net/http" "golang.org/x/oauth2/google"
googleapi: Error 403: Forbidden, forbiddenFinished
我已经检查了权限,appengine服务帐户可以访问这些存储桶,appengine应用程序和云存储存储存储桶都在同一个项目中
这是我的示例代码:
package src
import (
"fmt"
"net/http"
"golang.org/x/oauth2/google"
storage "google.golang.org/api/storage/v1"
appengine "google.golang.org/appengine"
)
func init() {
http.HandleFunc("/", index)
}
func ListBuckets(r *http.Request, projectID string) ([]*storage.Bucket, error) {
ctx := appengine.NewContext(r)
client, err := google.DefaultClient(ctx, storage.DevstorageReadOnlyScope)
if err != nil {
return nil, err
}
service, err := storage.New(client)
if err != nil {
return nil, err
}
buckets, err := service.Buckets.List(projectID).Do()
if err != nil {
return nil, err
}
return buckets.Items, nil
}
func index(w http.ResponseWriter, r *http.Request) {
r.Header.Set("x-goog-project-id", "theIdProvidedByTheAPI")
bucket, err := ListBuckets(r,"myProject")
if err != nil {
fmt.Fprint(w,err.Error())
}
for i:=range bucket {
fmt.Fprint(w,bucket[i].Name)
}
fmt.Fprint(w,"\n","Finished.")
}
这是yaml文件:
application: myProject
version: alpha-001
runtime: go
api_version: go1
handlers:
- url: /
script: _go_app
错误消息也没有帮助,因为它没有提供太多有用的信息。我就是想不出我遗漏了什么。我过去在使用
google.DefaultClient
方法时遇到过问题。下面是一个更明确的策略,用于配置可能对您有用的存储客户端对象:
httpClient = &http.Client{
Transport: &oauth2.Transport{
Source: google.AppEngineTokenSource(ctx, scopes...),
Base: &urlfetch.Transport{Context: ctx},
},
}
service, err := storage.New(httpClient)
if err != nil {
return nil, err
}
但是,我不熟悉禁止完成
错误消息,这可能表明问题出在其他地方
此外,如果您没有使用自动生成的google.golang.org/api/storage/v1
库的具体原因,我建议您使用更高级别的界面,可以在cloud.google.com/go/storage
上找到。这是它的go文档:
我过去对
google.DefaultClient
方法有过一些问题。下面是一个更明确的策略,用于配置可能对您有用的存储客户端对象:
httpClient = &http.Client{
Transport: &oauth2.Transport{
Source: google.AppEngineTokenSource(ctx, scopes...),
Base: &urlfetch.Transport{Context: ctx},
},
}
service, err := storage.New(httpClient)
if err != nil {
return nil, err
}
但是,我不熟悉禁止完成
错误消息,这可能表明问题出在其他地方
此外,如果您没有使用自动生成的google.golang.org/api/storage/v1
库的具体原因,我建议您使用更高级别的界面,可以在cloud.google.com/go/storage
上找到。这是它的go文档:
我也遇到过类似的情况。我之前提出的这个问题可能会有所帮助。我以前看过这篇文章,但是带有工作示例的代码在github上不再可用了。我之前提出的这个问题可能会有所帮助。我以前看过这篇文章,但是带有工作示例的代码在github上不再可用。