目前,我用字符串插值手工构造URI:
fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)
恕我直言,因为我通过env变量中的参数传递它们。我可以访问使用s3存储桶正确初始化的aws.Session对象。
是否有一种语义正确的方法(可能使用aws sdk API)生成 dummy 字符串构建器所执行的相同资源URI?
答案 0 :(得分:1)
虽然aws-sdk-go
确实在*http.Request
返回的结构中公开了svc.GetObjectRequest
,但它返回的URL实际上更像是一种“url格式”,直到您对请求运行方法为止Sign
或Presign
。
可以找到一些Presign
个例子On This Page。 Get示例提供以下输出:
请注意,我使用'get-resource-uri-test'作为我的存储桶名称,因为示例中的那个已经在使用
由于这不是您正在寻找的那种输出,我已经调整了示例以使用Sign
,这使得事情更加干净,因为auth信息被放入header / 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网址为https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey
虽然这个建议确实避免了实际上对S3的任何调用,但我确实对此感到复杂。在某些方面,aws-sdk-go
似乎在某种程度上消除了对URL操作的需要,而是由于您要完成的任务而生成它(主要是内部)。
因此,我们需要创建一个完整的S3客户端来获取来自亚马逊Go的正确'认可/祝福'网址吗? 这似乎有点过分,但这是我到目前为止从aws-sdk-go
接收格式化URL的唯一方法。如果其他人能够提出更合理的选择,我也鼓励那个人发布他/她的解决方案。
我可能不需要这样说,但如果这个例子是您计划大规模使用的,我建议您创建一个单独的s3客户端(在提供的示例中名为svc
)并且重复使用GetObjectRequest
方法,以避免每次需要确定URL时创建新客户端。