WireMock:如何模拟文件下载过程



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

我不知道它是否有帮助,终点在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"
    }
  }

一个很晚的答案,但我发现的唯一有效的解决方案是:

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

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

多或少还行...对于小文件。

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

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

使用 json DSL,您只有:

  • bodyFileName(注意:文档说:"正文文件应采用 UTF-8 格式"(
  • base64Body
  • 但像base64BodyFileName这样的事情是不可能的:-(

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

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

  • 在对应用程序/八位字节流的响应上设置内容类型标头
  • 将响应设置为使用正文文件(要下载的文件(

我使用这样的映射:

{
  "request": {
    "method": "GET",
    "url": "/files/b8b6461d-75c7-4908-a418-777140912059"
  },
  "response": {
    "status": 200,
    "bodyFileName": "file.pdf",
    "headers": {
      "Content-Type": "application/pdf",
      "Content-Disposition": "attachment;filename="file.pdf""
    }
  }
}

file.pdf是目录中__files的实际文件。对于使用此存根的客户端,它按预期工作。

最新更新