代码之家  ›  专栏  ›  技术社区  ›  Hoof

使用SpringWebFlux读取和分析S3PutRequest中的数据

  •  0
  • Hoof  · 技术社区  · 6 年前

    我有一个存根设置来处理与AWS S3桶交互的测试。(自定义)存根实现使用SpringWebFlux来响应例如s3 put请求。

    最近,我被迫更改S3实现以使用 InputStream 而不是作为输入的实际文件。我的问题是,当传递一个输入流而不是一个文件时,存根实现不会产生预期的结果。

    我的存根当前实现如下:

    RouterFunction<ServerResponse> putS3Object() {
        return RouterFunctions.route(PUT("/S3/MyBucket/{filename}").and(accept(TEXT_PLAIN))) { ServerRequest request ->
            return request.bodyToMono(String)
                    .doOnSuccess { s3Stubs.registerPutObject(request.pathVariable("filename"), it) }
                    .flatMap { response -> ServerResponse.ok().build() }
        }
    }
    

    传递给的字符串 s3Stubs.registerPutObject it 参数包含预期值“hello world”。

    现在,当我使用inputstream作为s3 api的参数而不是文件时, 参数不再是“人类可读的”。它包含如下数据: 18;chunk-signature=c27c7fa381b8aa2824e8487979d2d0e9ded04dd3 ..... 0;chunk-signature=db7e8b1bacc57da0d410ee116 -在那里我会期待同样的结果“你好世界”。

    我不确定这是否与我的WebFlux实现有关,或者与实际文件相比,S3如何处理输入流。

    使用完全相同的S3实现 输入流 把一个现实世界的S3桶…

    1 回复  |  直到 6 年前
        1
  •  0
  •   Brian Clozel    6 年前

    查看AWS S3 SDK,似乎 InputStream 变量还需要一些元数据,这些元数据应该包含内容的长度和base64散列。这可能是您在这里看到的发送到存根的内容。

    bodyToMono(String.class) 在内存中缓冲整个请求体并将其解码为字符串。对于其他线格式,Spring依赖于 Encoder Decoder 实现(有一个用于JSON,另一个用于Protobuf)。这是可能的,但是编写自己的代码非常复杂,在编写存根实现时可能不是最佳选择。

    如果您真的想阻止这种情况发生,您应该接受S3客户机发送给您的任何消息,或者阅读该客户机使用的实际有线格式。

    现在,关于您当前的实现:似乎您正在尝试在 doOnXYZ 方法。这些方法被称为“副作用”方法,因为它们的目标是打印一些日志或记录一些状态,但不执行与I/O相关的工作,而且绝对不会阻塞I/O。 Reactor offers ways to wrap blocking code for that .