为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 appengine.Context 创建云 context.Context

如何从 appengine.Context 创建云 context.Context

Go
沧海一幻觉 2021-11-01 16:27:14
我不知道如何打电话cloud.WithContext,google.DefaultClient如果我有appengine.Context和没有context.Context。有(旧)“appengine”和(新)“google.golang.org/appengine”包。第一个自定义带来了appengine.Context当第二个带有context.Context从"golang.org/x/net/context"整体google.golang.org/cloud期待context.Context而已。我很乐意改用 new "google.golang.org/appengine",但我一直坚持使用runtime.RunInBackground尚未移植的内容。来自https://github.com/golang/appengine:appengine/aetest,appengine/cloudsql并且appengine/runtime还没有移植。如果appengine/runtime已经移植,我可以写什么:import (    "golang.org/x/net/context"    "google.golang.org/appengine"    "google.golang.org/appengine/runtime"    "google.golang.org/cloud"    "google.golang.org/cloud/storage")func handler(w http.ResponseWriter, r *http.Request) {    c := appengine.NewContext(r)    runtime.RunInBackground(c, func(ctx context.Context) {        hc, _ := google.DefaultClient(ctx, storage.ScopeFullControl)        cc := cloud.WithContext(ctx, appengine.AppID(ctx), hc)        …   })}但还没有"google.golang.org/appengine/runtime"。所以我有runtime.RunInBackground(c, func(ctx appengine.Context) {
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

做这个:


func getCloudContext(appengineContext context.Context) context.Context {

    hc := &http.Client{

        Transport: &oauth2.Transport{

            Source: google.AppEngineTokenSource(appengineContext, storage.ScopeFullControl),

            Base:   &urlfetch.Transport{Context: appengineContext},

        },

    }


    return cloud.NewContext(appengine.AppID(appengineContext), hc)

}

或者,如果通过开发服务器传递凭据不起作用,您也可以使用显式凭据:


func getCloudContext(aeCtx context.Context) (context.Context, error) {

    data, err := ioutil.ReadFile("/path/to/credentials.json")

    if err != nil {

        return nil, err

    }


    conf, err := google.JWTConfigFromJSON(

        data,

        storage.ScopeFullControl,

    )

    if err != nil {

        return nil, err

    }


    tokenSource := conf.TokenSource(aeCtx)


    hc := &http.Client{

        Transport: &oauth2.Transport{

            Source: tokenSource,

            Base:   &urlfetch.Transport{Context: aeCtx},

        },

    }


    return cloud.NewContext(appengine.AppID(aeCtx), hc), nil

}


查看完整回答
反对 回复 2021-11-01
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信