【问题标题】:WireMock: How to mock file download process?WireMock:如何模拟文件下载过程?
【发布时间】:2017-05-22 18:24:48
【问题描述】:

我是WireMock 的新成员。我将WireMock 服务器作为独立进程运行。我可以通过在/mappings 文件夹下配置 json 文件来模拟简单的 rest api。现在,我想模拟一个文件下载端点。我该怎么做?

不知道有没有帮助,终点在Java/Spring,看起来是这样的:

@RequestMapping(value = "xxx/get", method = {RequestMethod.GET})
public ResponseEntity<Object> getFile(HttpServletResponse response) throws Exception {

    final Resource fileResource = fileResourceFactoryBean.getObject();

    if (fileResource.exists()) {
        try (InputStream inputStream = fileResource.getInputStream()) {
            IOUtils.copy(inputStream, response.getOutputStream());

            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileResource.getFilename());

            response.flushBuffer();
            inputStream.close();

            return new ResponseEntity<>(HttpStatus.OK);
        } catch (Exception e) {
            LOGGER.error("Error reading file: ", e);
            return new ResponseEntity<Object>("Error reading file.", HttpStatus.BAD_REQUEST);
        }
    }

    return new ResponseEntity<Object>(fileResource.getFilename() + " not found.", HttpStatus.BAD_REQUEST);
}

映射 json 文件中的响应部分如下所示:

"response": {
    "status": 200,
    "bodyFileName": "fileName", // file under __files directory
    "headers": {
      "Content-Type": "application/octet-stream"
    }
  }

【问题讨论】:

    标签: spring-mvc wiremock


    【解决方案1】:

    文件下载实际上与发送标记或 JSON 没有什么不同。如果 Web 浏览器无法将文件识别为可以呈现的 MIME 类型,则将文件视为下载。

    要使用 WireMock 实现这一点,请尝试:

    • 在对 application/octet-stream 的响应中设置 Content-Type 标头
    • 将响应设置为使用正文文件(您希望下载的文件)

    【讨论】:

    • 我已经用我正在使用的响应内容更新了我的问题。它符合你的建议。但这对我不起作用。你觉得那段响应内容有什么问题吗?你能拍一下吗?谢谢汤姆。
    • 你能更详细地描述你想要做什么吗?你如何测试存根?使用网络浏览器还是程序化客户端?你看到的失败是什么?
    • 实际上,我的客户端是一个cordova android应用程序,它调用服务器来下载(数据库)文件。我正在使用 WireMock 来模拟网络应用程序。错误说:匹配的响应定义:(未配置响应定义)
    • 好的,这意味着请求部分不正确。我建议检查您指定的 URL、方法和请求标头是否与应用程序发送的内容相匹配。如果您没有发现任何明显错误,请更新您的原始帖子并提供详细信息。
    • WireMock 正在接收每个控制台消息的请求。客户端收到 404 错误。来自 WireMock 的控制台日志显示以下内容:响应:HTTP/1.1 404 (no headers)
    【解决方案2】:

    一个很晚的答案,但我找到的唯一可行的解​​决方案是:

    "response": {
                "status": 200,
                "headers": {
                    "Content-Type": "image/jpeg"
                },
                "base64Body": "2wBDAAQDAwQDAwQE...=="       
            }
    

    我将使用 Base64 编码的图像内容直接放在映射文件中的位置。

    或多或少都可以...对于小文件。

    在java中,它似乎更方便一些:

    .willReturn( aResponse()
         .withBody( myImage.getBytes() )
    

    使用 json DSL,你只有:

    • bodyFileName(注意:文档说:“正文文件应为 UTF-8 格式”)
    • base64Body
    • 但是像base64BodyFileName 这样的东西不可能 :-(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      相关资源
      最近更新 更多