目前,我使用字符串插值手动构造 URI:
fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)
恕我直言,这是不好的,因为我通过环境变量中的参数传递它们。我可以访问使用我们的 s3 存储桶正确初始化的 aws.Session 对象。
是否有一种语义正确的方法(可能使用 aws sdk API)来生成与虚拟字符串生成器相同的资源 URI?
目前,我使用字符串插值手动构造 URI:
fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)
恕我直言,这是不好的,因为我通过环境变量中的参数传递它们。我可以访问使用我们的 s3 存储桶正确初始化的 aws.Session 对象。
是否有一种语义正确的方法(可能使用 aws sdk API)来生成与虚拟字符串生成器相同的资源 URI?
虽然确实aws-sdk-go
公开了*http.Request
由.svc.GetObjectRequest
Sign
Presign
在此页面Presign
上可以找到一些示例。Get 示例提供以下输出:
请注意,我使用“get-resource-uri-test”作为我的存储桶名称,因为示例中的名称已经在使用中
由于这不是您要查找的输出类型,因此我已将示例调整为 use 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 URL 是https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey
虽然这个建议确实避免了对 S3 的任何调用,但我确实对此感到复杂。在某些方面,aws-sdk-go
似乎旨在在一定程度上消除对 URL 操作的需要,而是生成它(主要是在内部)作为您尝试完成的结果的结果。
那么我们真的有必要创建一个完整的 S3 客户端来从 Go 中的 Amazon 获取正确的“认可/祝福”网址吗?这似乎有点过火了,但这是迄今为止我发现从aws-sdk-go
. 如果其他人能够提出更合理的替代方案,我会鼓励该人也发布他/她的解决方案。
我可能不需要这么说,但是如果您打算大规模使用此示例,我建议您创建一个 s3 客户端(svc
在提供的示例中命名)并重用其GetObjectRequest
方法以避免创建新的客户端每次需要确定一个 URL。