获取 s3 存储桶上的资源 URI
Get resource URI on s3 bucket
目前,我使用字符串插值手动构造 URI:
fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)
哪个恕我直言不好,因为我通过环境变量的参数传递它们。我可以访问使用我们的 s3 存储桶正确初始化的 aws.Session 对象。
是否有语义正确的方法(可能使用 aws sdk API)生成与 dummy 字符串生成器相同的资源 URI?
从一个例子...
虽然 aws-sdk-go
确实在 svc.GetObjectRequest
返回的结构中公开了 *http.Request
,但 URL 它 returns 实际上更像是 'url format' 直到你 运行 对请求的方法如 Sign
或 Presign
.
可以找到一些 Presign
个示例 On This Page。 Get 示例提供以下输出:
请注意,我使用 'get-resource-uri-test' 作为我的存储桶名称,因为示例中的存储桶名称已被使用
调整后的例子
由于这不是您要查找的输出类型,我已将示例调整为使用 Sign
,因为身份验证信息已放入 headers/etc 中,所以内容更加清晰].而不是 URL:
svc := s3.New(session.New(&aws.Config{Region: aws.String("us-west-2")}))
req, _ := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String("get-resource-uri-test"),
Key: aws.String("myKey"),
})
// Instead of using Presign, which was provided in example
if err := req.Sign(); err != nil {
log.Println("Failed to sign request", err)
}
log.Println("The URL is", req.HTTPRequest.URL)
2017/08/03 09:53:22 The URL is https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey
注意事项
虽然这个建议确实避免了对 S3 的任何实际调用,但我对此确实有复杂的感觉。在某些方面,aws-sdk-go
似乎旨在某种程度上消除对 URL 操作的需要,而是根据您要完成的操作生成它(主要是在内部)。
那么 真的 我们有必要创建一个完整的 S3 客户端来从 Amazon 在 Go 中正确地 'sanctioned/blessed' url 吗?这似乎有点过分,但这是迄今为止我发现的从 aws-sdk-go
接收格式化 URL 的唯一方法。如果其他人能够提出更合理的替代方案,我会鼓励那个人也 post his/her 解决方案。
我可能不需要这么说,但如果您打算大规模使用此示例,我建议您创建一个 s3 客户端(在提供的示例中名为 svc
) 并重复使用其 GetObjectRequest
方法以避免每次需要确定 URL.
时都创建新的客户端
目前,我使用字符串插值手动构造 URI:
fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)
哪个恕我直言不好,因为我通过环境变量的参数传递它们。我可以访问使用我们的 s3 存储桶正确初始化的 aws.Session 对象。
是否有语义正确的方法(可能使用 aws sdk API)生成与 dummy 字符串生成器相同的资源 URI?
从一个例子...
虽然 aws-sdk-go
确实在 svc.GetObjectRequest
返回的结构中公开了 *http.Request
,但 URL 它 returns 实际上更像是 'url format' 直到你 运行 对请求的方法如 Sign
或 Presign
.
可以找到一些 Presign
个示例 On This Page。 Get 示例提供以下输出:
请注意,我使用 'get-resource-uri-test' 作为我的存储桶名称,因为示例中的存储桶名称已被使用
调整后的例子
由于这不是您要查找的输出类型,我已将示例调整为使用 Sign
,因为身份验证信息已放入 headers/etc 中,所以内容更加清晰].而不是 URL:
svc := s3.New(session.New(&aws.Config{Region: aws.String("us-west-2")}))
req, _ := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String("get-resource-uri-test"),
Key: aws.String("myKey"),
})
// Instead of using Presign, which was provided in example
if err := req.Sign(); err != nil {
log.Println("Failed to sign request", err)
}
log.Println("The URL is", req.HTTPRequest.URL)
2017/08/03 09:53:22 The URL is https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey
注意事项
虽然这个建议确实避免了对 S3 的任何实际调用,但我对此确实有复杂的感觉。在某些方面,aws-sdk-go
似乎旨在某种程度上消除对 URL 操作的需要,而是根据您要完成的操作生成它(主要是在内部)。
那么 真的 我们有必要创建一个完整的 S3 客户端来从 Amazon 在 Go 中正确地 'sanctioned/blessed' url 吗?这似乎有点过分,但这是迄今为止我发现的从 aws-sdk-go
接收格式化 URL 的唯一方法。如果其他人能够提出更合理的替代方案,我会鼓励那个人也 post his/her 解决方案。
我可能不需要这么说,但如果您打算大规模使用此示例,我建议您创建一个 s3 客户端(在提供的示例中名为 svc
) 并重复使用其 GetObjectRequest
方法以避免每次需要确定 URL.