我在github https://github.com/googleapis/google-cloud-go/issues/1025上阅读了以下问题,发现所创建的空闲连接存在内存泄漏,因此将HTTP客户端添加到ClientOption可以解决问题。但是我想使用'WithCredentialsFile'选项实现它,但根据文档显示,'WithHTTPClient'不兼容。
下面是我的方法:
client, err := storage.NewClient(ctx, option.WithCredentialsFile(cred), option.WithHTTPClient(httpClient))
if err != nil {
return err
}
defer client.Close()
我总是收到以下错误:
"googleapi: Error 401: Anonymous caller does not have storage.objects.create access to <filepath>, required"
对此有任何解决方法吗?
更新: 我在调用newClient时尝试了以下方法来摆脱withCred
os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", cre)
client, err := storage.NewClient(ctx, option.WithHTTPClient(httpClient))
if err != nil {
return err
}
defer client.Close()
但是它仍然导致上述错误。虽然如果我尝试删除withHttp会导致内存泄漏(至少可以上传)
答案 0 :(得分:1)
我不知道您如何创建HttpClient。无论如何,如果您指定HTTPClient,it is used and this one by default not
但是,使用的传输层就是您的HTTPClient之一。默认情况下,它不会嵌入库默认情况下(以及使用您的凭据)创建的安全层。您必须在HTTPClient中重现此逻辑。
因此,在调用端点时,调用该端点时没有任何安全标头,因此您的401错误是正常的。
答案 1 :(得分:0)
我相信这将允许您使用自己的 HTTP 客户端。
import {
gcpTransport "google.golang.org/api/transport/http"
}
...
httpClient.Transport, err = gcpTransport.NewTransport(ctx, option.WithCredentialsFile(cred))
if err != nil {
return err
}
client, err := storage.NewClient(ctx, option.WithHTTPClient(httpClient))
if err != nil {
return err
}
defer client.Close()