以下代码试图从存储在S3上的文件中选择一些数据:
let client = S3Client::new(Region::default());
let source = ... object providing bucket and key ...;
let r = SelectObjectContentRequest {
bucket: source.bucket,
key: source.key,
expression: "select id from S3Object[*].id".to_string(),
expression_type: "SQL".to_string(),
input_serialization: InputSerialization {
json: Some(JSONInput { type_: Some("LINES".to_string()) }),
..Default::default()
},
output_serialization: OutputSerialization {
json: Some(JSONOutput { record_delimiter: Some("\n".to_string()) }),
..Default::default()
},
..Default::default()
};它会导致以下错误:
不允许针对此resource.POST使用指定的方法
这个例子是Python/boto3 3示例的1:1端口,所以我非常肯定它应该能工作。我找到了这个问题,它只有几个月的历史,我对它的状态还不清楚。我怎么才能让这个和Rust一起工作呢?
发布于 2019-08-26 12:22:43
不幸的是,s3 select仍然不能在最新的rusoto_s3-0.40.0上工作。你所链接的问题拥有所有的答案。问题有两方面。
首先,现在s3 select rusoto发出的请求有一个伪造的查询字符串。它应该是/ObjectName?select&select-type=2,但rusoto将其编码为/bjectName?select%26select-type=2。这就是你看到的错误。
要验证,请像这样运行您的项目:
$ RUST_LOG=rusoto,hyper=debug cargo run您将看到来自rusoto和hyper的日志。当然,它会发出一个不正确的URI。我们甚至可以钻研负责的代码
let mut params = Params::new();
params.put("select&select-type", "2");
request.set_params(params);它应该是:
let mut params = Params::new();
params.put("select-type", "2");
params.put("select", "");
request.set_params(params);虽然修复看起来很简单,但请记住,这些是从AWS botocore服务清单生成的胶水代码,而不是手动编码的。合并修复并不是那么简单。
第二,更大的问题。AWS s3选择响应使用自定义二进制格式。rusoto只是还没有一个反序列化器。
https://stackoverflow.com/questions/57628337
复制相似问题