登录
首页 >  Golang >  Go问答

使用自定义标头在 Go 中生成带有自定义标头的 gcp 签名 url

来源:stackoverflow

时间:2024-02-29 13:45:20 232浏览 收藏

从现在开始,努力学习吧!本文《使用自定义标头在 Go 中生成带有自定义标头的 gcp 签名 url》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

我正在尝试动态设置标头部分中的 x-goog-meta-reference ,因此我想在函数签名中传递一个名为引用的参数,并将其分配给标头中的 x-goog-meta-reference 。请参阅下面我的代码示例中的 x-goog-meta-reference 。我点击了有关规范请求的链接。

我的示例代码来自此处,但它是我的产品代码的编辑版本。

func GenerateSignedURL(ctx context.Context, bucket string, key string, expiration time.Time,
) (string, error) {
    gcsClient, err := storage.NewClient(ctx)
    if err != nil {
        return "", fmt.Errorf("storage.NewClient: %v", err)
    }
    defer gcsClient.Close()

    storage.SignedURL()
    opts := &storage.SignedURLOptions{
        Scheme:      storage.SigningSchemeV4,
        Method:      "PUT",
        ContentType: "text/csv",
        Headers:     []string{
            "x-goog-meta-reference: xxx", // << I want xxx value to be whatever I pass to this function as an arg
        },
        Expires:     expiration,
    }

    url, err := gcsClient.Bucket(bucket).SignedURL(key, opts)
    if err != nil {
        log.WithContext(ctx).Warn("Failed to generate a GCS signed URL")
        return "", err
    }

    return url, nil
}

我尝试查看一些示例,但它们都是 s3,并且我没有遇到任何 gcp 示例代码。然而,我确实发现了这个问题,但我自己无法解决。


正确答案


作为@dazwilkin mentionsfmt.sprintf 对于这种情况来说已经足够了,但您也可以使用我从 mozilla 移植的这个 library

import (
    "context"
    "fmt"
    "time"

    "cloud.google.com/go/storage"
    "github.com/dkbyo/go-stringhttpheader"
)

type Headers struct {
    GoogleMetaReference string `header:"x-goog-meta-reference"`
}

func GenerateSignedURL(bucket string, key string, expiration time.Time,
) (string, error) {
    ctx := context.Background()
    gcsClient, err := storage.NewClient(ctx)
    if err != nil {
        return "", fmt.Errorf("storage.NewClient: %v", err)
    }
    defer gcsClient.Close()
    headers := Headers{
        GoogleMetaReference: "xxx",
    }
    fmt.Print(stringhttpheader.Encode(headers))
    stringheaders, _ := stringhttpheader.Encode(headers)
    //storage.SignedURL()
    opts := &storage.SignedURLOptions{
        Scheme:      storage.SigningSchemeV4,
        Method:      "PUT",
        ContentType: "text/csv",
        Headers:     stringheaders,
        Expires:     expiration,
    }

    url, err := gcsClient.Bucket(bucket).SignedURL(key, opts)
    if err != nil {
        log.WithContext(ctx).Warn("Failed to generate a GCS signed URL")
        return "", err
    }

    return url, nil
}

好了,本文到此结束,带大家了解了《使用自定义标头在 Go 中生成带有自定义标头的 gcp 签名 url》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>